Use Case
尝试配置一个(Docker Swarm 或 Consul)集群,其中初始化集群首先发生在一个节点上,这会生成一些令牌,然后需要由加入集群的其他节点使用。关键是节点 1 和 2 在节点 0 生成加入密钥之前不应尝试加入集群。
例如。在节点 0 上运行docker swarm init ...
将返回一个加入令牌。然后在节点 1 和 2 上,您需要将该令牌传递给相同的命令,例如docker swarm init ${JOIN_TOKEN} ${NODE_0_IP_ADDRESS}:{SOME_PORT}
。神奇的是,你得到了一个整齐的小簇......
迄今为止的尝试
尝试初始化安装了 AWS SDK 的所有节点,并将节点 0 的连接密钥存储在 S3 上,然后在其他节点上获取该连接密钥。这是通过带有“remote-exec”配置程序的 null_resource 来完成的。由于 Terraform 并行执行事物的方式,存在活泼的类型条件,并且可以预见的是,节点 1 和 2 经常尝试从 S3 中获取尚不存在的密钥(例如,节点 0 尚未完成其工作)。
尝试使用“local-exec”配置程序通过 SSH 连接到节点 0 并捕获其加入密钥输出。这件事效果不佳,或者说我做得很糟糕。
我已阅读文档。以及堆栈溢出。还有 Github 问题,比如这真的很长一段杰出的经历 https://github.com/hashicorp/terraform/issues/610。彻底。如果这个问题已经在其他地方解决了,欢迎链接!
PS - 这与以下内容直接相关,并且是以下内容的较小子集这个问题 https://github.com/hashicorp/terraform/issues/610,但想重新询问以集中问题的范围。
您可以将输出重定向到文件:
resource "null_resource" "shell" {
provisioner "local-exec" {
command = "uptime 2>stderr >stdout; echo $? >exitstatus"
}
}
然后阅读stdout
, stderr
and exitstatus
文件与local_file
问题是,如果文件消失,那么 terraform apply 将失败。
在 terraform 0.11 中,我通过使用外部数据源读取文件并将结果存储在null_resource
触发(!)
resource "null_resource" "contents" {
triggers = {
stdout = "${data.external.read.result["stdout"]}"
stderr = "${data.external.read.result["stderr"]}"
exitstatus = "${data.external.read.result["exitstatus"]}"
}
lifecycle {
ignore_changes = [
"triggers",
]
}
}
但在 0.12 中这可以替换为file()
最后我可以使用/输出那些:
output "stdout" {
value = "${chomp(null_resource.contents.triggers["stdout"])}"
}
查看模块https://github.com/matti/terraform-shell-resource https://github.com/matti/terraform-shell-resource全面实施
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)