Bash 如何在多个VMWare vm';是由terraform模块创建的吗?

Bash 如何在多个VMWare vm';是由terraform模块创建的吗?,bash,module,terraform,vmware,Bash,Module,Terraform,Vmware,我正在使用这个模块在我的vmware集群上启动多个vm,我想在使用空资源后在所有vm上运行一个shell脚本。就我目前所拥有的,它抱怨主机没有得到字符串,这是有道理的。这是我的空资源: # main.tf module "jenkins-linuxvm-centos7" { source = "Terraform-VMWare-Modules/vm/vsphere" ... } resource "null_resource"

我正在使用这个模块在我的vmware集群上启动多个vm,我想在使用空资源后在所有vm上运行一个shell脚本。就我目前所拥有的,它抱怨主机没有得到字符串,这是有道理的。这是我的空资源:

# main.tf
module "jenkins-linuxvm-centos7" {
  source = "Terraform-VMWare-Modules/vm/vsphere"
  ...
}

resource "null_resource" "vm" {
  triggers = {
    vm_ips = join(",", module.jenkins-linuxvm-centos7.Linux-ip)
  }

  # export TF_VAR_root_password=<pass>
  connection {
    type     = "ssh"
    host     = module.jenkins-linuxvm-centos7.Linux-ip
    user     = "root"
    password = var.vm_root_password
    port     = "22"
    agent    = false
  }

  provisioner "file" {
    source      = "resize_disk.sh"
    destination = "/tmp/resize_disk.sh"
  }

  provisioner "remote-exec" {
    inline = [
      "chmod +x /tmp/resize_disk.sh",
      "/tmp/resize_disk.sh"
    ]
  }
}
#main.tf
模块“jenkins-linuxvm-centos7”{
source=“Terraform VMWare模块/vm/vsphere”
...
}
资源“null_”资源“vm”{
触发器={
vm_ips=join(“,”,module.jenkins-linuxvm-centos7.Linux ip)
}
#导出TF\u VAR\u root\u密码=
联系{
type=“ssh”
主机=module.jenkins-linuxvm-centos7.Linux-ip
user=“root”
password=var.vm\u root\u密码
port=“22”
代理=错误
}
供应器“文件”{
source=“resize\u disk.sh”
destination=“/tmp/resize_disk.sh”
}
供应器“远程执行”{
内联=[
“chmod+x/tmp/resize_disk.sh”,
“/tmp/resize_disk.sh”
]
}
}

我是否需要以某种方式使用动态块?或者,我如何修改主机=module.jenkins-linuxvm-centos7.Linux ip以包含我想要运行它的所有主机?

您必须在For\u Each循环中运行它。。。下面是一个示例代码,我在其中针对sql_var map变量进行循环。您必须针对IPs-->模块的输出执行此操作。jenkins-linuxvm-centos7.Linux ip。。。您将能够引用每台机器的IP作为类似于每个值的值。我不知道你的输出是什么样子,所以我猜。如果你是新手,这里有一首不错的芭蕾舞曲


你必须在一个For_循环中运行它。。。下面是一个示例代码,我在其中针对sql_var map变量进行循环。您必须针对IPs-->模块的输出执行此操作。jenkins-linuxvm-centos7.Linux ip。。。您将能够引用每台机器的IP作为类似于每个值的值。我不知道你的输出是什么样子,所以我猜。如果你是新手,这里有一首不错的芭蕾舞曲


这是一个很好的答案,但terraform似乎不喜欢使用输出作为其for_值。获取此信息:`Error:Invalid for_each参数位于main.tf行52,在资源“null_resource”“vm”:52:for_each=toset(module.jenkins-linuxvm-centos7.Linux ip)“for_each”值取决于资源属性,在应用之前无法确定,因此Terraform无法预测将创建多少实例。要解决此问题,请使用-target参数首先仅应用for_各自依赖的资源`嘿@nateph,要克服每个问题的
,请声明一个布尔变量&使用该布尔变量决定是否必须在服务器上运行脚本
for_each
count
不能应用于远程状态下不存在的资源。一个选项是使用您引用的
-target
,另一个选项是定义一个伪布尔变量,当您想要运行脚本时只需覆盖它。这是一个很好的答案,但terraform似乎不喜欢使用输出作为每个值的输出。获取此信息:`Error:Invalid for_each参数位于main.tf行52,在资源“null_resource”“vm”:52:for_each=toset(module.jenkins-linuxvm-centos7.Linux ip)“for_each”值取决于资源属性,在应用之前无法确定,因此Terraform无法预测将创建多少实例。要解决此问题,请使用-target参数首先仅应用for_各自依赖的资源`嘿@nateph,要克服每个问题的
,请声明一个布尔变量&使用该布尔变量决定是否必须在服务器上运行脚本
for_each
count
不能应用于远程状态下不存在的资源。一个选项是使用您引用的
-target
,另一个选项是定义一个伪布尔变量,当您想要运行脚本时只需覆盖它即可。
resource "null_resource" "instance" {
 
for_each = var.sql_var
  
    provisioner "local-exec" {
      command = "echo ${each.key} >> hello.txt"
  }
  
}