捕获 Terraform 配置程序输出?

2023-12-23

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(使用前将#替换为@)

捕获 Terraform 配置程序输出? 的相关文章

随机推荐