TerraForm,如何在现有资源上运行置备程序? [英] Terraform, How to run the provisioner on existing resources?

查看:20
本文介绍了TerraForm,如何在现有资源上运行置备程序?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的问题类似于这个git中心帖子:

https://github.com/hashicorp/terraform/issues/745

还与我的另一个堆栈交换帖子有关:

Terraform stalls while trying to get IP addresses of multiple instances?

我正在尝试引导几个服务器,我需要在我的实例上运行几个命令,这些命令需要所有其他实例的IP地址。但是,在创建新创建的实例之前,我无法访问保存它们的IP地址的变量。因此,当我尝试像这样运行provisioner "remote-exec"挡路时:

  provisioner "remote-exec" {
    inline = [
      "sudo apt-get update",
      "sudo apt-get install -y curl",
      "echo ${openstack_compute_instance_v2.consul.0.network.0.fixed_ip_v4}",
      "echo ${openstack_compute_instance_v2.consul.1.network.1.fixed_ip_v4}",
      "echo ${openstack_compute_instance_v2.consul.2.network.2.fixed_ip_v4}"
    ]
  }
不会发生任何事情,因为所有实例都在等待所有其他实例完成创建,因此首先不会创建任何内容。所以我需要一种方法来创建我的资源,然后在创建后运行我的provisioner "remote-exec"挡路命令,并且Terraform可以访问我所有实例的IP地址。

推荐答案

解决方案是创建resource "null_resource" "nameYouWant" { },然后在其中运行命令。它们将在创建初始资源后运行:

resource "aws_instance" "consul" {
  count = 3
  ami = "ami-ce5a9fa3"
  instance_type = "t2.micro"
  key_name = "ansible_aws"
  tags {
    Name = "consul"
  }
}

resource "null_resource" "configure-consul-ips" {
  count = 3

  connection {
    user = "ubuntu"
    private_key="${file("/home/ubuntu/.ssh/id_rsa")}"
    agent = true
    timeout = "3m"
  }

  provisioner "remote-exec" {
    inline = [
      "sudo apt-get update",
      "sudo apt-get install -y curl",
      "sudo echo '${join("
", aws_instance.consul.*.private_ip)}' > /home/ubuntu/test.txt"
    ]
  }
}

另请参阅此处的答案:

Terraform stalls while trying to get IP addresses of multiple instances?

非常感谢@ydaetskcor的答复

这篇关于TerraForm,如何在现有资源上运行置备程序?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆