Terraform,如何 运行 现有资源的配置器?
Terraform, How to run the provisioner on existing resources?
我的问题与此类似 git hub post:
https://github.com/hashicorp/terraform/issues/745
也和我的另一个栈交换post有关:
我正在尝试 bootstrap 多个服务器,我需要在我的实例上 运行 执行多个命令,这些命令需要所有其他实例的 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("\n", aws_instance.consul.*.private_ip)}' > /home/ubuntu/test.txt"
]
}
}
也可以在这里查看答案:
非常感谢@ydaetskcor 的回答
除了@alex-cohen 的回答,还有来自 https://github.com/hashicorp/terraform/issues/8266#issuecomment-454377049 的另一个提示。
如果您想发起对 local-exec
的调用,而不考虑资源创建,请使用 triggers
:
resource "null_resource" "deployment" {
provisioner "local-exec" {
command = "echo ${PATH} > output.log"
}
triggers = {
always_run = timestamp()
}
}
我的问题与此类似 git hub post:
https://github.com/hashicorp/terraform/issues/745
也和我的另一个栈交换post有关:
我正在尝试 bootstrap 多个服务器,我需要在我的实例上 运行 执行多个命令,这些命令需要所有其他实例的 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("\n", aws_instance.consul.*.private_ip)}' > /home/ubuntu/test.txt"
]
}
}
也可以在这里查看答案:
非常感谢@ydaetskcor 的回答
除了@alex-cohen 的回答,还有来自 https://github.com/hashicorp/terraform/issues/8266#issuecomment-454377049 的另一个提示。
如果您想发起对 local-exec
的调用,而不考虑资源创建,请使用 triggers
:
resource "null_resource" "deployment" {
provisioner "local-exec" {
command = "echo ${PATH} > output.log"
}
triggers = {
always_run = timestamp()
}
}