Templates 参数化地形模板

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} $

我有一个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} ${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
引用旨在确保每个服务器获得不同的主机名。