Назад | Перейти на главную страницу

Ansible двойной цикл в hostvars

Я хочу перебрать переменные всех хостов определенной группы.

Со следующими данными в hostvars (упрощенно):

{
    "server1": {
        "group_names": ["web"],
        "sites": {
            "website1": { "id": "site1", "domain": "..." }
            "website2": { "id": "site2", "domain": "..." }
         },
     }
     "server2": {
        "group_names": ["web"],
        "sites": {
            "website3": { "id": "site3", "domain": "..." }
        }
     }
}

Я хочу, чтобы на третьем сервере (сервере базы данных) были созданы все db:

- name: create databases
- mysql_db:
      name: "{{ item.1.id }}"
- with_subelements:
      - "{{ groups["web"] }}"
      - "{{ hostvars[item.0]['sites']

Это не работает, у меня ошибка: {"failed": true, "msg": "'item' is undefined"}

Как мне написать роль?

Вот вам немного магии джиндзя:

инвентарь:

localhost ansible_ssh_host=127.0.0.1 ansible_connection=local

[web]
host1 sites="{'web1':{'id':'z1'},'web2':{'id':'z2'}}"
host2 sites="{'web3':{'id':'z3'}}"

демо:

---
- hosts: localhost
  gather_facts: no
  tasks:
    - debug:
        msg: "Site name – {{ item.key }}, id - {{ item.value.id }}"
      with_dict: "{{ dict(groups['web'] | map('extract',hostvars,'sites') | map('dictsort') | sum(start=[]) | list) }}"

я делаю dictsort->sum->dict трюк, потому что твой sites объект - это словарь (а не список), и перебирать вложенные словари не так просто.