Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 如何让Terraform等待cloudinit完成?_Amazon Web Services_Terraform_Cloud Init - Fatal编程技术网

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

Amazon web services 如何让Terraform等待cloudinit完成?,amazon-web-services,terraform,cloud-init,Amazon Web Services,Terraform,Cloud Init,在我的示例中,我使用cloudinit初始化EC2实例。然而,Terraform表示,在cloud init完成之前,资源已经准备就绪。有没有一种方法可以让它在理想情况下等待cloud init完成,而无需使用null资源进行SSHing或检查端口是否已启动。您和双方都使用模板\u cloudinit\u config。它们还有ec2:CreateTags 您可以使用EC2资源标签,如trajano/terraform docker swarm aws/cloudinit complete来指示

在我的示例中,我使用cloudinit初始化EC2实例。然而,Terraform表示,在cloud init完成之前,资源已经准备就绪。有没有一种方法可以让它在理想情况下等待cloud init完成,而无需使用
null
资源进行SSHing或检查端口是否已启动。

您和双方都使用模板\u cloudinit\u config。它们还有ec2:CreateTags

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

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

部分{ filename=“tag_complete.sh” content=local.tag\u complete\u脚本 content\u type=“text/x-shell脚本” }

并声明标记完成脚本如下:

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
}
本地人{

tag_complete_script=这是一个很好的问题。前几天我在为Packer考虑这个问题。可能两者都存在类似的解决方案。我会想一想,并尝试回答这个问题。这假设您的本地计算机是UNIX,但我喜欢这个想法。好的观点!在本地执行器中以跨平台友好的方式调用Python可能更好请注意,Python是一个先决条件。直接使用boto3而不是AWS CLI编写此轮询器将非常容易。是的,我想根据我的操作使用SSH remote_exec,但我也想避免这种情况,因为它假设TerraFormerInDect中提供了服务的私钥。我正在破解我的brain提供了一种绕过ssh或端口检查的方法。标记似乎是一个不错的选择。在Docker容器或WSL中运行Terraform构建对于Windows用户来说似乎是一个可以接受的要求,但我已经好几年没有在工作中使用Windows了,因此我可能不应该为该用户群说话。如果标记应用于terraform管理的资源,因为它会将其剥离。
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
  }
}