gpt4 book ai didi

amazon-web-services - 如何让 Terraform 等待 cloudinit 完成?

转载 作者:行者123 更新时间:2023-12-03 23:47:01 27 4
gpt4 key购买 nike

在我的 Terraform AWS Docker Swarm module我使用 cloud-init 来初始化 EC2 实例。但是,Terraform 表示在 cloud-init 完成之前资源已准备就绪。有没有办法让它等待 cloud-init 理想地完成而无需使用 SSH 连接或使用 null 检查端口是否启动资源。

最佳答案

您的 managersworkers两者都使用 template_cloudinit_config .他们还有 ec2:CreateTags .

您可以使用 EC2 资源标签,如 trajano/terraform-docker-swarm-aws/cloudinit-complete 表示 cloudinit 已完成。

您可以将这最后一部分添加到每个部分以调用标记脚本:

部分 {
文件名 = "tag_complete.sh"
内容 = local.tag_complete_script
content_type = "text/x-shellscript"
}

并声明 tag_complete_script 如下:

locals {
tag_complete_script = <<-EOF
#!/bin/bash
instance_id="${TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \
&& curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/latest/meta-data/instance-id}"
aws ec2 create-tags --resources "$instance_id" --tags 'Key=trajano/terraform-docker-swarm-aws/cloudinit-complete,Value=true'
EOF
}

然后使用 null_resource,等待标 checkout 现(在我的手机上写的,所以将其用于一般想法,但我不希望它在没有测试和编辑的情况下会起作用):
resource "null_resource" "wait_for_cloudinit" {
provisioner "local-exec" {
command = <<-EOF
#!/bin/bash
poll_tags="aws ec2 describe-tags --filters 'Name=resource-id,Values=${join(",", aws_instance.managers[*].id)}' 'Name=key,Values=trajano/terraform-docker-swarm-aws/cloudinit-complete' --output text --query 'Tags[*].Value'"
expected='${join(",", formatlist("true", aws_instance.managers[*].id))}'
$tags="$($poll_tags)"
while [[ "$tags" != "$expected" ]] ; do
$tags="$($poll_tags)"
done
EOF
}
}

这样你就可以依赖 null_resource.wait_for_cloudinit 在 cloudinit 完成后需要运行的任何资源上。

关于amazon-web-services - 如何让 Terraform 等待 cloudinit 完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62116684/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com