我成功地使用 Terraform(来自 Packer 映像)在 Azure 中创建了虚拟机。创建虚拟机后,我将在新创建的机器上远程运行一些命令。
该机器有一个公共 IP,但该 IP 动态附加到由 terrafrom 创建的新资源组。在这种情况下,在 terraform 启动之前我不知道公共 IP。
不幸的是,remote-exec 配置程序需要一个 ip 来连接和 ssh 连接。我该如何解决这个问题?
答案1
有两种方法可以做到这一点。
1.创建VM时,使用DNS名称。HOST是<dns name>.<location>.cloudapp.azure.com
。
在 tf 文件中,创建如下所示的公共 IP:
# create public IPs
resource "azurerm_public_ip" "ip" {
name = "tfip"
location = "ukwest"
resource_group_name = "${azurerm_resource_group.rg.name}"
public_ip_address_allocation = "dynamic"
domain_name_label = "sometestdn"
tags {
environment = "staging"
}
}
像下面这样创建连接:
connection {
host = "sometestdn.ukwest.cloudapp.azure.com"
user = "testuser"
type = "ssh"
private_key = "${file("~/.ssh/id_rsa_unencrypted")}"
timeout = "1m"
agent = true
}
provisioner "remote-exec" {
inline = [
"sudo apt-get update",
"sudo apt-get install docker.io -y",
"git clone https://github.com/somepublicrepo.git",
"cd Docker-sample",
"sudo docker build -t mywebapp .",
"sudo docker run -d -p 5000:5000 mywebapp"
]
}
2.使用Azure 自定义脚本扩展。
自定义脚本扩展可在 Azure 虚拟机上下载并执行脚本。此扩展可用于部署后配置、软件安装或任何其他配置/管理任务。
你可以像下面这样编写你的 tf:
resource "azurerm_virtual_machine_extension" "helloterraformvm" {
name = "hostname"
location = "West US"
resource_group_name = "${azurerm_resource_group.helloterraformvm.name}"
virtual_machine_name = "${azurerm_virtual_machine.helloterraformvm.name}"
publisher = "Microsoft.OSTCExtensions"
type = "CustomScriptForLinux"
type_handler_version = "1.2"
settings = <<SETTINGS
{
"commandToExecute": "apt-get install docker.io -y"
}
SETTINGS
}
更多信息请参考此类似问题。