Я создаю сценарии Ansible, которые создают инфраструктуру нашей системы в AWS. Очевидно, задействованы динамические инвентаризации с использованием ec2.py.
Сначала я создаю служебный сервер, затем веб-сервер, и у меня есть отдельная книга для каждого из них. У меня есть файлы на веб-сервере, для которых необходимо добавить частный IP-адрес служебного сервера с помощью шаблона.
Как лучше всего получить частный IP-адрес служебного сервера для использования в playbook веб-сервера?
IP-адреса серверов являются частью обнаруживаемых фактов о хостах. Эти факты извлекаются автоматически при запуске playbook, если вы явно не отключите gather_facts
.
И даже тогда вы можете явно использовать setup
модуль для сбора фактов.
Эти значения затем можно использовать в следующих задачах.
Например:
$ ansible -c local -m setup -a 'filter=ansible_*address*' localhost
127.0.0.1 | SUCCESS => {
"ansible_facts": {
"ansible_all_ipv4_addresses": [
"172.17.0.1",
"192.168.122.1",
"192.168.0.12",
"172.18.0.1"
],
"ansible_all_ipv6_addresses": [
"fe80::e8b5:946f:410b:aff5"
]
},
"changed": false
}
Было три проблемы:
Решение 3 - указать переменную в командной строке, используя дополнительные переменные, например: ansible-playbook -i ./ec2.py --extra-vars "chaos = test" aws_playground.yaml
Решение 2 найти нужное имя хоста из переменной hostvars groups. В сочетании с 3 выше вы хотите что-то вроде: - debug: var = hostvars [groups ['tag_Name _' + chaos + '_ util'] [0]]. ansible_all_ipv4_addresses [0]
Решение 1 заключается в том, чтобы сначала собрать факты с другого сервера, прежде чем работать на сервере, который вы настраиваете. Ниже представлена инструкция, в которой все это собрано в одном месте:
# Called like: ansible-playbook -i ./ec2.py --extra-vars "chaos=test" aws_playground.yaml
- name: Collect our facts on util
hosts: "tag_Name_{{ chaos }}_util"
tasks: [ ]
- name: Set up a web server
hosts: "tag_Name_{{ chaos }}_web"
tasks:
- debug: var=hostvars[groups['tag_Name_'+chaos+'_util'][0]].ansible_all_ipv4_addresses[0]