У меня проблема с подготовкой Terraform. Когда я впервые запускаю terraform, я использую SSH-ключ, сгенерированный в консоли AWS. Этот ключ добавляется пользователю ubuntu (это Ubuntu 16.04 AMI). Затем я запускаю remote-exec подготовку:

provisioner "remote-exec" {
  inline = [
  "sudo apt -y update && sudo apt install -y python"
  ]
  connection {
    user = "ubuntu"
    private_key = "${file("${var.aws_default_key_name}.pem")}"
  }
}

Мне нужно установить python, чтобы я мог использовать Ansible позже. Это единственное место, где мне нужен этот ключ, никогда больше, потому что я создаю собственного пользователя с моим закрытым ключом. Однако, когда я пытаюсь запустить terraform позже, он ищет файл file("${var.aws_default_key_name}.pem". Теперь у меня вопрос, как пропустить эту подготовку при последующих запусках?

Я не хочу хранить ключ SSH в репозитории.

Я мог бы создать пустой файл, чтобы «обмануть» терраформ, но мне это решение не нравится.

Есть идеи получше?

2
Mat 19 Июл 2017 в 01:10

2 ответа

Вместо того, чтобы выполнять подготовку в блоке aws_instance, переместите его в null_resource с соответствующими триггерами.

resource "aws_instance" "cluster" {
  count = 3

  # ...
}

resource "null_resource" "cluster" {
  # Changes to any instance of the cluster requires re-provisioning
  triggers {
    cluster_instance_ids = "${join(",", aws_instance.cluster.*.id)}"
  }

  connection {
    host = "${element(aws_instance.cluster.*.public_ip, 0)}"
  }

  provisioner "remote-exec" {
    inline = [something]
  }
}

Если ваши триггеры не изменятся, подготовка null_resource не будет запускаться при последующих запусках.

2
RaGe 19 Июл 2017 в 03:29
Я протестирую и дам вам знать, но кажется многообещающим!
 – 
Mat
20 Июл 2017 в 22:43

Sparrowform - это облегченный провайдер для инфраструктуры на основе Terraform. Преимущества по сравнению с другими инструментами подготовки заключаются в том, что этап terraform apply, который выполняет загрузку инфраструктуры, отделен от этапа подготовки, поэтому вы можете сделать следующее:

$ terraform apply # does infra bootstrap

$ nano sparrowfile # Sparrowdo equivalent for remote-exec chunk

#!/usr/bin/env perl6

bash 'apt -y update';
package-install 'python';

$ sparrowform --ssh_user=my-user --ssh_private_key=/path/to/key  # do provision stage

Очевидно, вы можете не запускать sparrowform последующих запусков . Он выполняет свою работу (устанавливает доступные связанные зависимости, вот и все). Затем вы отбрасываете свой начальный ssh_private_key и переходите с новым закрытым ключом (я полагаю, это связано с недоступностью?)

PS. раскрытие информации - я автор инструмента

0
Alexey Melezhik 26 Янв 2018 в 23:59