Я развернул огромное количество хостов с помощью Ansible, и это действительно отлично работало. Каждый хост получил свои индивидуальные настройки и конфигурацию.
Теперь я хотел бы создать файл конфигурации для другой системы, использующей эти хосты. Для этого мне нужно для каждого хоста часть сгенерированной конфигурации (той, которая настраивает базу данных).
Вот пример ситуации, когда два хоста имеют разную конфигурацию, а другая система использует часть конфигурации, сгенерированной Ansible:
host1
доступный настроенный dbA
host2
доступный настроенный dbQ
Другая система:
host1 = dbA
host2 = dbQ
Значения вычисляются по-разному (dbQ
вместо того dbB
для host2
например), если он принадлежит к другому кластеру и т. д., что делает непрактичным просто считывание конфигурации хоста из host_vars
. Я считаю, что мне нужно было бы перебрать хосты и позволить Ansible вычислить вычисленные значения для переменных, как при развертывании, но я не знаю, как поместить этот результат в один шаблон.
Пожалуйста, порекомендуйте :)
Если я правильно понимаю вашу ситуацию, вы можете сделать это, используя комбинацию set_fact и / или шаблона, который затем проходит через все хосты. Например, предположим, что у вас есть задача, определенная примерно так:
- name : Configure database
command: /path/to/some/script {{ inventory_hostname }} {{ some_var }} {{ some_other_var }}
Вы можете использовать set_fact, чтобы связать эти значения с рассматриваемым хостом:
- name: Stash the variables for later use
set_fact:
var_1 : {{ some_var }}
var_2 : {{ some_other_var }}
host_and_var : "{{ inventory_hostname }}-{{ some_var}}"
etc.
Затем, когда придет время создать файл конфигурации, у вас будет действие шаблона или local_action, которое генерирует файл конфигурации. Шаблон будет содержать что-то вроде этих строк:
{% for host in groups['some_host_group']|sort %}
{% if hostvars[host]["var_1"] is defined %}
{{ host }} = {{ hostvars[host]["var_1"] }}
{% endif %}
{% endfor %}