Не совсем уверен в том, как это делается в 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