terraform изменяет поведение индекса количества для удаленного exec - PullRequest
0 голосов
/ 06 марта 2019

Попытка изменить / etc / hosts с помощью имени хоста экземпляра и частного IP.Например, файл "/ etc / hosts" должен выглядеть следующим образом.

member-1 <some private ip>
member-2 <some private ip>

Следующий код, который я нашел из самого stackoverflow, будет близок к выполнению выше, но мне трудно понять, где увеличить индекс на 1 (count.index + 1), чтобыЯ могу получить результат, упомянутый выше, вместо member-1 для member-0 и member-2 для member-1.

variable "cluster_member_count" {
  default = "2"
}
variable "cluster_member_name_prefix" {
  default = "member-"
}
variable "aws_keypair_privatekey_filepath" {
  default = "../mykey.pem"
}


resource "aws_instance" "example" {
//
  }



resource "null_resource" "hosts_file" {
  count = "${var.cluster_member_count}"

  # Changes to any instance of the cluster requires re-provisioning
  triggers {
    cluster_instance_ids = "${join(",", aws_instance.example.*.id)}"
  }
  connection {
    type = "ssh"
    host = "${element(aws_instance.example.*.public_ip, count.index)}"
    user = "ec2-user"
    private_key = "${file(var.aws_keypair_privatekey_filepath)}"
  }
  provisioner "remote-exec" {
    inline = [
      # Adds all cluster members' IP addresses to /etc/hosts (on each member)
      "echo '${join("\n", formatlist("%v", aws_instance.example.*.private_ip))}' | awk 'BEGIN{ print \"\\n\\n# Cluster members:\" }; { print $0 \ ${var.cluster_member_name_prefix}\ NR-1 }' | sudo tee -a /etc/hosts > /dev/null",
    ]
  }
}

Пожалуйста, может ли новичок получить некоторую помощь?

Большое спасибо заранее

1 Ответ

0 голосов
/ 08 марта 2019

Когда я делал подобные вещи раньше с помощью count, я почти уверен, что сделал что-то вроде этого:

resource "null_resource" "my_resource" {
  count = "${var.cluster_count}"

  name = "cluster-node-${count.index+1}"
}

Итак, в вашем примере вы захотите добавить $ {count.index + 1} после упоминания $ {var.cluster_member_name_prefix}, я полагаю.

Однако, как упоминает @ matt-schuchard, возможно, лучше использовать шаблоны, поскольку, на мой взгляд, ваша текущая реализация не очень читабельна.

Вы должны быть в состоянии передать переменные в шаблон (например, количество элементов, которые вам нужны), а затем использовать эту переменную с циклом для создания правильной конфигурации файла, которая вам нужна.

Шаблоны очень удобны для такого рода вещей.

Кроме того, если вы собираетесь запускать много команд на серверах (для установок и т. П.), Потенциально инструмент, подобный Ansible, подойдет вместо команды remote_exec в terraform.

Некоторые ссылки, которые могут помочь:

https://www.terraform.io/docs/providers/template/index.html https://www.terraform.io/docs/configuration/expressions.html#string-templates

...