Ansible with_dicts group_vars playbook
Мое требование - получить приведенный ниже вывод в файл
- targets: [ 'host1:port1', 'host2:port1' , 'host3:port1' ]
job : hostgroup1
- targets: [ 'host1:port2', 'host2:port2' , 'host3:port3' ]
job : hostgroup2
У меня есть входной файл, как показано ниже, и он должен извлекать данные из переменных или групповых переменных. В Hostgroup1 у меня может быть n хостов, а в Hostgroup2 у меня n хостов
Hostgroup1 : host1,host2,host3....n
Hostgroup2 : host1,host2,host3....n
Я запутался, как создать шаблон jinja и задачи, чтобы получить этот вывод
1 ответ
Решение
Ну, я определил что-то вроде твоих данных в разделе "vars" в сборнике. Вы можете поместить его в файл vars, или вы можете определить эти vars в ваших hostvars/groupvars или что-то в этом роде. Это, вероятно, не совсем то, что вы хотите, но вы можете адаптировать его к вашим потребностям.
- hosts: localhost
gather_facts: no
vars:
data:
- { "name": "hostgroup1", "port": 80, "hosts": ["host1", "host2", "host3"] }
- { "name": "hostgroup2", "port": 443, "hosts": ["host5", "host6", "host7"] }
tasks:
- debug:
msg: |
{% for item in data %}
- job: {{ item.name }}
targets: [ {%- for host in item.hosts -%}
"{{ host }}:{{ item.port }}",
{%- endfor -%}]
{% endfor %}
Выход
# ANSIBLE_STDOUT_CALLBACK=debug ansible-playbook 20190404_sf_961529.yml
PLAY [localhost] ************************************************************************************
TASK [debug] ****************************************************************************************
ok: [localhost] => {}
MSG:
- job: hostgroup1
targets: ["host1:80","host2:80","host3:80",]
- job: hostgroup2
targets: ["host5:443","host6:443","host7:443",]
PLAY RECAP ******************************************************************************************
localhost : ok=1 changed=0 unreachable=0 failed=0
Для вывода в файл вы можете использовать задачу вроде этой.
- copy:
dest: outputpath
content: |
{% for item in data %}
- job: {{ item.name }}
targets: [ {%- for host in item.hosts -%}
"{{ host }}:{{ item.port }}",
{%- endfor -%}]
{% endfor %}