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 %}
Другие вопросы по тегам