【问题标题】:Terraform - output ec2 instance ids to calling shell scriptTerraform - 输出 ec2 实例 ID 到调用 shell 脚本
【发布时间】:2018-12-14 11:55:01
【问题描述】:

我在 shell 脚本中使用 'terraform apply' 来创建多个 EC2 实例。我需要将生成的 IP 列表输出到脚本变量并在另一个子脚本中使用该列表。我在 terraform 配置文件中为 ips 定义了输出变量 - 'instance_ips'

output "instance_ips" {
 value = [
  "${aws_instance.gocd_master.private_ip}",
  "${aws_instance.gocd_agent.*.private_ip}"
 ]
}

但是,terraform apply 命令正在打印除输出变量之外的整个 EC2 生成输出。

terraform init \
  -backend-config="region=$AWS_DEFAULT_REGION" \
  -backend-config="bucket=$TERRAFORM_STATE_BUCKET_NAME" \
  -backend-config="role_arn=$PROVISIONING_ROLE" \
  -reconfigure \
  "$TERRAFORM_DIR"

OUTPUT = $( terraform apply <input variables e.g - 
                  var="aws_region=$AWS_DEFAULT_REGION">
                 -auto-approve \
                 -input=false \
                 "$TERRAFORM_DIR"
               )

terraform output instance_ips

所以'OUTPUT'脚本变量内容是

Terraform command: apply Initialising the backend...  Successfully 
configured the backend "s3"! Terraform will automatically use this 
backend unless the backend configuration changes. Initialising provider 
plugins... Terraform has been successfully initialised!
.
.
.
aws_route53_record.gocd_agent_dns_entry[2]: Creation complete after 52s 
(ID:<zone ............................) 
aws_route53_record.gocd_master_dns_entry: Creation complete after 52s 
(ID:<zone ............................)  
aws_route53_record.gocd_agent_dns_entry[1]: Creation complete after 53s 
(ID:<zone ............................)   
Apply complete! Resources: 9 added, 0 changed, 0 destroyed.  Outputs: 
instance_ips = [ 10.39.209.155, 10.39.208.44, 10.39.208.251, 
10.39.209.227 ]

而不仅仅是 EC2 ips。

触发 'terraform output instance_ips' 会引发 'Initialisation Required' 错误,我理解这意味着需要 'terraform init'。

有什么方法可以抑制 ec2 生成并仅打印输出变量。如果没有,如何使用“terraform output”命令检索 IP,而无需执行 terraform init?

【问题讨论】:

  • 您是否在运行 terraform 应用时从目录运行 terraform 输出。它不应该再次重新初始化。通常,在运行 apply 之前运行 terraform init。
  • 'terraform init' 、 'terraform apply' 和 'terraform output' 都在同一个 shell 脚本中按顺序运行
  • 您提到您在脚本中使用terraform output,但您的脚本仅显示您捕获terraform apply 的输出。你能分享完整的东西吗? terraform output 是您想要捕获 Terraform output 而不是运行 terraform apply 的标准输出。
  • 我已经包含了脚本部分,其中依次调用 terraform init、apply 和 output 命令

标签: amazon-web-services unix amazon-ec2 terraform


【解决方案1】:

如果我正确理解上下文,您实际上可以在该目录中创建一个文件,并且您的子 shell 脚本可以使用该文件。您可以使用null_resource 或“local_file”来完成。

这是我们如何在模块化结构中使用它 -

使用null_resource -

resource "null_resource" "instance_ips" {
  triggers {
       ip_file = "${sha1(file("${path.module}/instance_ips.txt"))}"
      }
  provisioner "local-exec" {
    command = "echo ${module.ec2.instance_ips} >> instance_ips.txt"
  }
}

使用local_file -

resource "local_file" "instance_ips" {
    content     = "${module.ec2.instance_ips}"
    filename = "${path.module}/instance_ips.txt"
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-23
    • 1970-01-01
    • 2020-07-09
    • 2023-04-02
    • 1970-01-01
    • 2020-03-10
    • 2018-11-06
    相关资源
    最近更新 更多