Ansible с Terraform запускают playbook на одном из нескольких хостов

#amazon-web-services #ansible #terraform #terraform-provider-aws

Вопрос:

Моя конечная цель — создать 3-узловой кластер kubeadm kubernetes с terraform и / или ansible. На данный момент я готовлю три идентичных экземпляра с помощью terraform. Затем с remote-exec помощью и inline установкой пакетов, которые все экземпляры совместно используют между собой. Теперь я хочу установить определенные пакеты только на один из этих трех экземпляров. Пытаясь добиться этого с помощью local-exec .

Я борюсь с подключением только к 1 экземпляру с помощью local-exec. Я знаю, как подключиться ко всем из них и выполнить playbook в трех экземплярах. Но конечная цель — подключиться только к одному экземпляру.

код обрезан:

 resource "aws_instance" "r100c96" {
  count              = 3
  ami                = "ami-0b9064170e32bde34" 
  instance_type      = "t2.micro"
  key_name           = local.key_name

  tags = {
    Name = "terra-ans${count.index}"
  }

  provisioner "remote-exec" {
    connection {
      host        = "${self.public_ip}"
      type        = "ssh"
      user        = local.ssh_user
      private_key = file(local.private_key_path)  
    }
    inline = ["sudo hostnamectl set-hostname test"]
  }


  provisioner "local-exec" {
   
    command = "ansible-playbook  -i ${element((aws_instance.r100c96.*.public_ip),0)}, --private-key ${local.private_key_path} helm.yaml"

  }
...
}
 

Спасибо,

Комментарии:

1. В чем ошибка?

Ответ №1:

Вы можете использовать null_resource и запускать remote-exec только для выбранного экземпляра, как только все три экземпляра aws_instance.r100c96 будут подготовлены.

Комментарии:

1. дзеки Марчин, это сработало. Большое спасибо!

Ответ №2:

Я думаю, что вместо * того, чтобы использовать count.index , при каждом loop запуске он будет передавать определенный IP-адрес виртуальной машины.

Кроме того, существует несколько способов подготовки виртуальной машины с помощью Ansible. Подумайте, можете ли вы динамически создавать файл Hosts и предоставлять их параллельно, а не по одному за раз.