Двойной цикл with_items в ansible - PullRequest
       6

Двойной цикл with_items в ansible

0 голосов
/ 02 ноября 2018

Я хочу создать двойной цикл в ansible. У меня есть одна вещь, как это:

userslist:
  - name: user1
    primary : user1-group
    groups :
       - group1
       - group2
  - name: user2
    primary : user2-group
    groups :
       - group3
       - group4

- name : Creating Secondary group
  group :
    name : "{{ item.groups }}"
    state: present
  with_items: "{{ userslist}}"

Возможно ли для каждого пользователя создавать каждую вторичную группу? Я думаю, что для этого мне нужно сделать второй цикл with_items, но я не знаю, как

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Я делаю это, и это работает очень хорошо

---

- hosts: all
  become: yes
  vars:
    userslist:
      - name: user1
        primary : user1-group
        groups :
           - group1
           - group2
      - name: user2
        primary : user2-group
        groups :
           - group3
           - group4

  tasks:
  - name: Creating Secondary group
    group:
      name="{{ item.1 }}"
    with_subelements:
      - '{{ userslist }}'
      - groups

0 голосов
/ 02 ноября 2018

Существует два способа сделать вложенный (двойной) цикл в Ansible.

  • with_nested. Это позволяет вам иметь внутреннюю итерацию для объекта, который вы повторяете во внешнем цикле. Примеры и пояснения приведены в официальной документации: https://docs.ansible.com/ansible/2.5/plugins/lookup/nested.html

  • с использованием with_items вместе с include_tasks. Это сложная, но мощная конструкция. В теории нет предела (кроме глубины стека) того, насколько вложенной может быть эта конструкция.

Требуется поместить внутренний код в отдельный список задач. Я покажу это с помощью outer.yaml и inner.yaml, внешнего цикла выполнения над списком, а внутреннего - выполнения цикла над элементом (переменной цикла) внешнего цикла.

outer.yaml:

- name: Loop over foo
  include_tasks: inner.yaml
  with_items: '{{ foo }}'
  loop_control:
     loop_var: inner_var_name
  vars:
   foo:
    - [1, 2, 3]
    - [a, b, c]

inner.yaml:

- name: Performing operation one
  debug: msg="Action one for {{ item }}"
  with_items: '{{ inner_var_name }}'

- name: Performing operation two
  debug: msg="Action two for {{item}}"
  with_items: '{{ inner_var_name }}'

Ключевым преимуществом этого метода является то, что inner.yaml может содержать любое количество операторов, все из которых будут обработаны в цикле от outer.yaml.

Одна важная вещь: все include вещи требуют некоторой осторожности со всем, что связано с передачей значений (set_fact, register и т. Д.) Из включенного кода. Это довольно сложно и неочевидно, поэтому я никогда не советую использовать переменные, заданные в include-коде, вне этого включения.

...