我编写了一个Terraform脚本来创建一些Azure虚拟机。
创建VM的数量是基于我的type文件中的一个名为.tfvars的变量:
type = [ "Master-1", "Master-2", "Master-3", "Slave-1", "Slave-2", "Slave-3" ]
我的variables.tf文件包含以下local
count_of_types = "${length(var.type)}"
我的resources.tf文件包含了根据以下信息实际创建相关VM数量所需的代码:
resource "azurerm_virtual_machine" "vm" {
count = "${local.count_of_types}"
name = "${replace(local.prefix_specific,"##TYPE##",var.type[count.index])}-VM"
location = "${azurerm_resource_group.main.location}"
resource_group_name = "${azurerm_resource_group.main.name}"
network_interface_ids = ["${azurerm_network_interface.main.*.id[count.index]}"]
vm_size = "Standard_B2ms"
tags = "${local.tags}"最后,在我的output.tf文件中,输出每个服务器的IP地址:
output "public_ip_address" {
value = ["${azurerm_public_ip.main.*.ip_address}"]
}我正在创建一个Kubernetes集群,包含1xMaster和1x从VM。为此目的,脚本工作良好-第一个IP输出是主IP输出,第二个IP输出是从IP输出。
但是,当我总共迁移到8+ VM时,我想知道哪个IP引用哪个VM。
是否有一种方法可以修改我的输出以包括本地的type,或者只包括服务器的主机名和公共IP?
例如54.10.31.100 // Master-1。
发布于 2019-03-11 09:52:09
看看formatlist (它是字符串操作的函数之一),它可以用于迭代实例属性、列表标记和其他感兴趣的属性。
output "ip-address-hostname" {
value = "${
formatlist(
"%s:%s",
azurerm_public_ip.resource_name.*.fqdn,
azurerm_public_ip.resource_name.*.ip_address
)
}"
}注意,这只是一个伪代码草案。您可能必须对此进行调整,并在TF文件中创建其他数据源以获得有效的枚举。
提供更多阅读资料- https://www.terraform.io/docs/configuration/functions/formatlist.html
发布于 2019-03-11 14:13:05
Raunak Jhawar's answer把我指向正确的方向,因此得到了绿色的滴答。
作为参考,下面是我最后使用的确切代码:
output "public_ip_address" {
value = "${formatlist("%s: %s", azurerm_virtual_machine.vm.*.name, azurerm_public_ip.main.*.ip_address)}"
}这导致了以下产出:

https://stackoverflow.com/questions/55098721
复制相似问题