我们需要在GCP中使用terraform创建2个VM:
- 不同的启动脚本
- 我们需要第一个和第二个VM不能同时创建。
- 我们还需要创建的第一个VM的IP,并将其传递给第二个VM的元数据脚本。我们怎么做呢?
这是我们创建1个VM的工作地形文件:
provider "google" {
project = "project-name"
region = "europe-west3"
zone = "europe-west3-c"
}
resource "google_compute_instance" "vm_instance" {
name = "terra-instance-with-script-newvpc"
machine_type = "n1-standard-2"
zone = "europe-west3-c"
boot_disk {
initialize_params {
image ="centos-7"
}
}
metadata = {
startup-script = <<-EOF
hello world
EOF
}
network_interface {
subnetwork="test-subnet-frankfurt"
}
}
我们尝试添加另一个脚本,但失败了
- 确保在第一个GCE实例之后创建第二个GCE实例一种方法是使用
depends_on
参数(参见示例代码)下图) - 对于启动脚本,您可以使用单独的云初始化脚本,并使用Terraform变量管理它们,如
- 对于IP地址部分,根据您的需要,有2种可能的用例:
- 分配公共静态IP:您可以先使用
google_compute_address
Terraform资源为第一个实例准备IP,然后再调用network_interface {access_config = { nat_ip = google_compute_address.static.first_instance_ip.address }}
参数中的此资源(参见下面的例子) 然后,在第二个实例的初始化脚本中,您可以再次调用Terraform资源 - 如果你想使用一个短暂的(生成的)IP,那么你根本不需要使用
google_compute_address
,在你的第二个实例的初始化脚本中,调用第一个实例Terraform资源的nat IP属性,例如:google_compute_instance.firs_instance.network_interface.0.access_config.0.nat_ip
,并以你想要的方式注入到你的脚本中。
google_compute_address.first_instance_ip.address
,并按您想要的方式将其注入脚本中。 - 分配公共静态IP:您可以先使用
在下面的示例代码中,它假设您将使用静态IP地址:
# Create the IP address
resource "google_compute_address" "static" {
name = "first_instance_ip_address"
}
# Source the init script and inject the IP Address variable
data "template_file" "init" {
template = "${file("./startup.sh")}" # call your startup script from it's path
vars = {
first_instance_ip = "${google_compute_address.static.address}"
# In case you use the generated IP:
# first_instance_ip = "${google_compute_compute_instance.first_instance.network_interface.0.access_config.0.nat_ip}"
}
}
# Create the 1st google compute instance
resource "google_compute_instance" "firs_instance" {
depends_on = [google_compute_address.static]
....
# Associated our public IP address to this instance
access_config = {
nat_ip = google_compute_address.static.address
}
}
...
# Create your second IP same as the first one
...
#Create the second google compute instance
resource "google_compute_instance" "second_instance" {
depends_on = [google_compute_instance.first_instance]
...
# Associated our public IP address to this instance
access_config = {
nat_ip = google_compute_address.second_static_ip.address # optional depends on your usecase
}
}
metadata_startup_script = "${data.template_file.startup_script.rendered}"
}
p。S:这不是一个完整的和生产就绪的代码,它是一个提示的集合,以帮助您解决您的问题。