Получите ip's экземпляров группы автоматического масштабирования и предоставьте их ansible - PullRequest
0 голосов
/ 10 декабря 2018

В настоящее время я разрабатываю сценарий terraform и ответные роли для установки mongodb с репликацией.Я использую группу автоматического масштабирования, и мне нужно передать, частные экземпляры ec2 в ansible как дополнительные переменные.есть ли способ сделать это?

Когда дело доходит до rs.initiate (), есть ли способ добавить частный ip ec2 в кластер Монго, когда terraform создает экземпляры.

1 Ответ

0 голосов
/ 10 декабря 2018

Не совсем уверен в том, как это делается в ASG, возможно, было бы полезно сочетание пользовательских данных и метаданных EC2.

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

Использование сценариев динамической инвентаризации EC2.
Ссылка - https://docs.ansible.com/ansible/2.5/user_guide/intro_dynamic_inventory.html

Это в основном скрипт на python, т.е. ec2.pyкоторый получает частный IP-адрес экземпляра с использованием тегов и т. д. Он поставляется с файлом конфигурации с именем ec2.ini.

Пометьте свой экземпляр в сценарии TF (добавьте тег роли) -

resource "aws_instance" "ec2" {

  ....

  tags                    = "${merge(var.tags, map(
                            "description","mongodb-node",
                            "role", "mongodb-node",
                            "Environment", "${local.env}",))}"
}

output "ip" {
  value       = ["${aws_instance.ec2.private_ip}"]
}

Получите частный IP-адрес экземпляра в playbook -

- hosts: localhost
  connection: local
  tasks:
    - debug: msg="MongoDB Node IP is - {{ hostvars[groups['tag_role_mongodb-node'][0]].inventory_hostname  }}"

Теперь запустите playbook, используя TF null_resource -

resource null_resource "ansible_run" {

  triggers {
       ansible_file = "${sha1(file("${path.module}/${var.ansible_play}"))}"
      }
  provisioner "local-exec" {
    command = "ANSIBLE_HOST_KEY_CHECKING=False ansible-playbook -i ./ec2.py --private-key ${var.private_key} ${var.ansible_play}"
  }
}

Необходимо убедиться, что переменные среды, связанные с AWS, присутствуют / экспортируются дляможно получить метаданные AWS EC2.Также убедитесь, что ec2.py является исполняемым.

Если вы хотите получить частный IP, измените следующую конфигурацию в ec2.ini -

destination_variable = private_ip_address
vpc_destination_variable = private_ip_address
...