Templates 参数化地形模板
我有一个terraform项目要在Openstack中创建99个虚拟机,我不能使用cloud init,我必须修改每台机器的主机名 hostname.tplt:Templates 参数化地形模板,templates,cloud,openstack,terraform,Templates,Cloud,Openstack,Terraform,我有一个terraform项目要在Openstack中创建99个虚拟机,我不能使用cloud init,我必须修改每台机器的主机名 hostname.tplt: sudo sed -i -e "s/debian[7-9]/${host_name}/g" /etc/hostname sudo invoke-rc.d hostname.sh start sudo sed -i -e "s/127\.0\.1\.1.*/127.0.1.1\t${host_name}.${domain_name} $
sudo sed -i -e "s/debian[7-9]/${host_name}/g" /etc/hostname
sudo invoke-rc.d hostname.sh start
sudo sed -i -e "s/127\.0\.1\.1.*/127.0.1.1\t${host_name}.${domain_name} ${host_name}/g" /etc/hosts
sudo apt-get update && sudo apt-get -y install dbus && sudo hostnamectl set-hostname ${host_name}
data "template_file" "hostname_servers" {
template = "${file("templates/hostname.tplt")}"
vars {
host_name = "${format("%s-proxy-%02d", var.prefix_name, count.index+1)}"
domain_name = "${var.domain_name}"
}
}
main.tf的一部分:
sudo sed -i -e "s/debian[7-9]/${host_name}/g" /etc/hostname
sudo invoke-rc.d hostname.sh start
sudo sed -i -e "s/127\.0\.1\.1.*/127.0.1.1\t${host_name}.${domain_name} ${host_name}/g" /etc/hosts
sudo apt-get update && sudo apt-get -y install dbus && sudo hostnamectl set-hostname ${host_name}
data "template_file" "hostname_servers" {
template = "${file("templates/hostname.tplt")}"
vars {
host_name = "${format("%s-proxy-%02d", var.prefix_name, count.index+1)}"
domain_name = "${var.domain_name}"
}
}
资源
用例:
当我启动terraform计划时,它对代理实例资源有效,但我需要对99台机器执行此操作,
我不想重复模板数据99次, 我不知道如何将模板参数化,以便能够应用于所有机器
有什么想法吗?如果在多个资源上将
count
设置为相同的值,则可以使用count.index
在一个块的实例和另一个块的实例之间创建对应关系,如下所示:
data "template_file" "hostname_servers" {
count = "${var.count_proxy}"
template = "${file("templates/hostname.tplt")}"
vars {
host_name = "${format("%s-proxy-%02d", var.prefix_name, count.index+1)}"
domain_name = "${var.domain_name}"
}
}
resource "openstack_compute_instance_v2" "proxy-instance" {
count = "${var.count_proxy}"
name = "${format("%s-proxy-%02d", var.prefix_name, count.index+1)}"
image_name = "${var.image}"
flavor_name = "${var.flavor_proxy}"
network {
name = "${format("%s-%s", var.prefix_name, var.network_name)}"
}
connection {
user = "${var.user}"
}
provisioner "remote-exec" {
inline = [
# use count.index to match the template instance corresponding
# to this compute instance instance.
"${data.template_file.hostname_servers.*.rendered[count.index]}"
]
}
}
你的主机名应该是什么样子?它们是否都不同,或者它们是否遵循一种模式,例如
host-1.example.com
?主机名是我更新我的问题的资源名host\u name=“${format”(%s-proxy-%02d),var.prefix\u name,count.index+1)}那么您当前拥有的有什么问题?这看起来可以在多达99台机器上正常工作。我不喜欢复制(数据模板99次)数据“模板文件”“主机名服务器”{template=“${file”(/templates/hostname.tplt”)}“vars{host\u name=“${format”(%s-proxy-%02d),var.prefix\u name,count.index+1)}”domain\u name=“${var.domain\u name}”我希望evry MACHINE的名称为instance=hostname每个资源都有一个特定的名称,因此在您的解决方案中,我的所有机器的名称都是相同的计数。index
引用旨在确保每个服务器获得不同的主机名。