我使用 OpenTofu 中的配置程序首先将脚本复制到远程 Linux 计算机:
provisioner "file" {
source = "scripts/base.sh"
destination = "/tmp/base.sh"
connection {
type = "ssh"
user = var.c_user
password = var.d_passwd_user
host = var.vm_ip
}
}
...然后使用remote-exec运行一些有用的命令,然后使用sudo执行脚本(sudo对于'base.sh'中的内容是强制性的)。
provisioner "remote-exec" {
inline = [
"echo 'SSH connection successful' > /tmp/1ssh_test_flag",
"alias sudo='sudo -S <<< ${var.d_passwd_user}'",
"sudo chmod +x /tmp/base.sh",
"sudo /tmp/base.sh",
]
connection {
type = "ssh"
user = var.c_user
password = var.d_passwd_user
host = var.vm_ip
}
}
您在命令“alias sudo='sudo -S <<< ${var.d_passwd_user}”中看到的变量在“内联”命令执行块中工作得很好,因此它们显然可供该命令使用,但内部的变量我的脚本文件“base.sh”引用了“variables.tf”和“terraform.tfvars”中声明的变量,脚本或bash看不到它们,当它尝试使用它们时,我收到错误(错误的替换)。
我的“base.sh”脚本文件中的内容以及依赖于 terraform.tfvars 中提供的变量和“tofu apply -vars”提供的变量的示例:
#!/bin/bash
echo 'root:${var.new_root_passwd}' | chpasswd
subscription-manager register --org=XXX --activationkey=${var.satellite_key} && echo '${var.satellite_key}' > /opt/activationkey_satellite.txt
opentofu如何成功将变量传递给“alias sudo='sudo -S <<< ${var.d_passwd_user}'", but fail to pass variables to a remotely executing script?
发生这种情况是因为 terraform/tofu 对外部事物一无所知。换句话说,在进行变量替换时,不会考虑 shell 脚本(和其他附带文件)。为了克服这个问题,您可以使用
templatefile
内置函数。例如:
provisioner "file" {
source = templatefile("{path.module}/scripts/base.sh", {
satelite_key = var.satellite_key
new_root_passwd = var.new_root_passwd
})
destination = "/tmp/base.sh"
connection {
type = "ssh"
user = var.c_user
password = var.d_passwd_user
host = var.vm_ip
}
}
要实现此目的,您仍然需要编辑 shell 脚本以使用以下内容:
#!/bin/bash
echo 'root:${new_root_passwd}' | chpasswd
subscription-manager register --org=XXX --activationkey=${satellite_key} && echo '${satellite_key}' > /opt/activationkey_satellite.txt