Ansible: зацикливание на вложенных словарных переменных - PullRequest
2 голосов
/ 27 марта 2020

У меня есть следующий файл vars.yml с вложенным dict.:

hosts:
  server_1:    
    apps:
      - x1
      - x2
      - x3
      - x4
      - x5
    storage:
      -
      -
    cpu:
      -
      -
  server_2:    
    apps:
      - y1
      - y2
      - y3
      - y4
      - y5
    storage:
      -
      -
    cpu:
      -
      -
server_N:    
    apps:
      - n1
      - n2
      - n3
      - n4
      - n5

И я хочу использовать его в следующем примере playbook как al oop через переменные, чтобы задача выполнялась несколько раз раз по диктовке:

- hosts: localhost
  gather_facts: no
  vars_files:
    - vars.yml

  tasks:
    - name: Install apps
      debug:
          msg: "{{ item.value }}"
          msg: "{{ item.value.apps }}"
      with_dict: "{{ hosts }}"

Я хочу использовать их в качестве переменных и получить в результате l oop итерацию, где сервер и приложение коррелируют.

1. msg: "server_1"
   msg: "x1"
2. msg: "server_1"
   msg: "x2"
3.  msg: "server_1"
   msg: "x3"
....etc
6. msg: "server_2"
   msg: "y1"
7. msg: "server_2"
   msg: "y2"
....etc

Я думаю, что вы есть идея Также не должно иметь значения, сколько «server_N» доступно в файле vars.yml!

Какой самый простой и правильный способ получить этот результат?

Ответы [ 2 ]

0 голосов
/ 27 марта 2020

Задание

    - debug:
        msg: "{{ item.0.key }} {{ item.1 }}"
      with_subelements:
        - "{{ hosts|dict2items }}"
        - value.apps

дает

    "msg": "server_N n1"
    "msg": "server_N n2"
    "msg": "server_N n3"
    "msg": "server_N n4"
    "msg": "server_N n5"
    "msg": "server_1 x1"
    "msg": "server_1 x2"
    "msg": "server_1 x3"
    "msg": "server_1 x4"
    "msg": "server_1 x5"
    "msg": "server_2 y1"
    "msg": "server_2 y2"
    "msg": "server_2 y3"
    "msg": "server_2 y4"
    "msg": "server_2 y5"
0 голосов
/ 27 марта 2020

Правильный способ - поместить эту информацию в файлы host_vars/server1, host_vars/server2 и т. Д. c.:

# this is host_vars/server1
apps:
  - x1
  - x2
  - x3
  - x4
  - x5
storage:
  -
  -
cpu:
  -
  -

Тогда ваша книга воспроизведения будет выглядеть следующим образом:

- hosts: all
  gather_facts: no

  tasks:
  - name: Install apps
    debug:
      msg: "{{ item }}"
    with_items: "{{ apps }}"
    delegate_to: localhost      # if really necessary
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...