我是Terraform的新手。我有一个带有两个Ubuntu VM的子网。一个是VM A
,它具有公共IP,另一个是VM B
,具有私有IP且没有公共IP。是否有一种Terraform方式在B
上配置文件和运行命令,而无需先将SSH连接到VM A
,然后再连接到VM B
?
根据我的发现,Terraform中的file
个配置文件需要connection
块,如下所示:
# Example Azure VM provisioner block
provisioner "remote-exec" {
inline = [
"rsync -Pav user@A:~/install.sh ~",
"rsync -Pav user@A:~/file.txt ~",
"sudo ~/install.sh"
]
connection {
type = "ssh"
user = "${var.ssh_user_username}"
host = "<something to put here>"
private_key = "${file("~/.ssh/azure_key_rsa")}"
timeout = "1m"
agent = false
}
}
但由于我无法直接在Terraform中连接私有IP,因此我不确定要为host
字段添加什么才能使此配置程序成功。
答案 0 :(得分:1)
根据我的知识,你无法直接使用terraform。
您可以使用Custom Script extension执行install.sh
,该脚本由Azure执行,您不需要ssh到VM。
自定义脚本扩展配置指定脚本位置和要运行的命令之类的内容。此配置可以存储在配置文件中,在命令行中指定,或存储在Azure Resource Manager模板中。敏感数据可以存储在受保护的配置中,该配置是加密的,只能在虚拟机内解密。根据您的情况,您似乎需要它。
Terraform也支持CustomScript,您可以参考此example。
resource "azurerm_virtual_machine_extension" "test" {
name = "hostname"
location = "West US"
resource_group_name = "${azurerm_resource_group.test.name}"
virtual_machine_name = "${azurerm_virtual_machine.test.name}"
publisher = "Microsoft.OSTCExtensions"
type = "CustomScriptForLinux"
type_handler_version = "1.2"
settings = <<SETTINGS
{
"commandToExecute": "hostname"
}
SETTINGS