цикл по хостам в шаблоне jinja2 как переменная - PullRequest
0 голосов
/ 04 ноября 2019

Мне известно, что Ansible поддерживает циклы в шаблонах в такой форме:

{% for host in groups['all'] %}
join= {{ hostvars[host]['ansible_eth0']['ipv4']['address'] }}:29016
{% endfor %}

Я хочу изменить инвентаризацию хостов на динамическую и принять переменную хостов

Например, Imagineэта настройка:

# hosts
[testOne]
192.168.42.2
192.168.42.10 
192.168.42.20

[testTwo]
192.168.42.212
192.168.42.101 
192.168.42.202

playbook.yml

---

- hosts: all
  gather_facts: no
  tasks:
    - name: Hosts
      template: src=myhosts.j2 dest=./myhosts.json
      delegate_to: 127.0.0.1
      run_once: yes

{% for host in groups['{{ hosts }}'] %}
join= {{ hostvars[host]['ansible_eth0']['ipv4']['address'] }}:29016
{% endfor %}

и работает как:

ansible-playbook -i hosts playbook.yml -e"hosts=testTwo"

Но Ansible не знает, как интерпретировать переменную hosts в список и циклчерез это

Любая помощь? Спасибо!

1 Ответ

0 голосов
/ 04 ноября 2019

Вы должны использовать --limit, чтобы выбрать переменную хоста (ов) / группы (ей)

и ansible_play_hosts_all для циклического воспроизведения.


Демонстрация:

hosts.ini:

[group1]
host1 ansible_host=1.2.3.4 ansible_connection=local
host2 ansible_host=2.3.4.5 ansible_connection=local

[group2]
host3 ansible_host=3.4.5.6 ansible_connection=local
host4 ansible_host=4.5.6.7 ansible_connection=local

play.yml:

---
- hosts: all
  gather_facts: no

  tasks:

    - debug:
        msg: |
          {% for host in ansible_play_hosts_all -%} 
          {{ host }},  
          {%- endfor %}
      delegate_to: localhost
      run_once: yes
$ ansible-playbook -i hosts.ini play.yml --limit group1

PLAY [all] *********************************************************************************************************************************

TASK [debug] *******************************************************************************************************************************
ok: [host1 -> localhost] => {
    "msg": "host1,host2,\n"
}

PLAY RECAP *********************************************************************************************************************************
host1                      : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
$ ansible-playbook -i hosts.ini play.yml --limit host1,host3

PLAY [all] *********************************************************************************************************************************

TASK [debug] *******************************************************************************************************************************
ok: [host1 -> localhost] => {
    "msg": "host1,host3,\n"
}

PLAY RECAP *********************************************************************************************************************************
host1                      : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

...