Arc*_*ano 4 amazon-web-services cloud-init terraform
在我的Terraform AWS Docker Swarm 模块中,我使用 cloud-init 来初始化 EC2 实例。但是,Terraform 表示在 cloud-init 完成之前资源已准备就绪。有没有办法让它等待 cloud-init理想地完成而无需 SSH 连接或使用null资源检查端口是否启动。
您的经理和员工都使用template_cloudinit_config。他们也有ec2:CreateTags。
您可以使用像trajano/terraform-docker-swarm-aws/cloudinit-complete这样的 EC2 资源标签来指示 cloudinit 已完成。
您可以将这最后一部分添加到每个部分以调用标记脚本:
部分 { 文件名 = "tag_complete.sh" content = 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
}
Run Code Online (Sandbox Code Playgroud)
然后使用 null_resource,等待标签出现(在我的手机上写的,所以将其用于一般想法,但我不希望它在没有测试和编辑的情况下会起作用):
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
}
}
Run Code Online (Sandbox Code Playgroud)
通过这种方式,您可以在 cloudinit 完成后需要运行的任何资源上依赖null_resource.wait_for_cloudinit。
| 归档时间: |
|
| 查看次数: |
2424 次 |
| 最近记录: |