首页 > 解决方案 > 如何在 terraform 模块创建的多个 VMWare 虚拟机上运行 shell 脚本?

问题描述

我正在使用此模块在我的 vmware 集群https://registry.terraform.io/modules/Terraform-VMWare-Modules/vm/vsphere/1.6.0上启动多个虚拟机,并且我想在其上运行一个 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"
    ]
  }
}

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

标签: bashmoduleterraformvmware

解决方案


您必须在 For_Each 循环中运行它...下面是一个示例代码,我在其中循环 sql_var 映射变量。您将不得不针对 IPs 的输出执行此操作 --> module.jenkins-linuxvm-centos7.Linux-ip ... 您将能够将每台机器的 IP 引用为类似于 each.value 我猜的东西。我不知道你的输出是什么样子的,所以猜测。如果您不熟悉循环,这里有一篇不错的教程。

https://blog.boltops.com/2020/10/04/terraform-hcl-loops-with-count-and-for-each

resource "null_resource" "instance" {
 
for_each = var.sql_var
  
    provisioner "local-exec" {
      command = "echo ${each.key} >> hello.txt"
  }
  
}

推荐阅读