bash - 如何在 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
以包含我想要运行它的所有主机?
解决方案
您必须在 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"
}
}
推荐阅读
- docker - 在 Jenkins 中找不到 package.json
- java - 在 Spring MVC 中不能将有效的 JSON 数组作为请求正文
- php - 在浏览器中强制 404
- xamarin - 为 Xamarin Forms 应用程序创建 MSI 安装程序
- javascript - 如何断言所有 $ReadOnlyArray 成员都属于某种类型?
- javascript - 在 vue.js 应用程序中设置视口元标记
- php - 在 Laravel 项目中上传视频
- pandas - Pandas,isin,列表列
- java - 根据 Collection.toArray(T[] array) 合同将 Java 流转换为数组
- python - 条件语句 Python Apache Beam 管道