Петли внутри петель - PullRequest
       3

Петли внутри петель

0 голосов
/ 06 января 2020

Я настроил некоторую информацию о приложении в своем Ansible group_vars, например, так:

applications:
  - name: app1
  - name: app2
  - name: app3
  - name: app4
    settings:
      log_dir: /var/logs/app4
      associated_files:
        - auth/key.json
  - name: app5
    settings:
      log_dir: /var/logs/app5
      repo_path: new_apps/app5

Я изо всех сил пытаюсь понять, как я могу использовать эти «подциклы».

Мои задачи для каждого приложения:

  1. Создание некоторых папок на основе значения name
  2. Создание папки журнала, если существует значение settings/log_dir
  3. Копировать связанные файлы, если указано

Синтаксис для этих задач здесь не проблема, мне это удобно - мне просто нужно знать, как получить доступ к информация из этой applications переменной. В частности, число 3 кажется мне проблематичным - мне нужно l oop в пределах al oop.

Чтобы отладить это, я пытался выполнить следующую задачу:

- debug:
    msg: "{{ item }}"
  with_subelements:
    - "{{ applications }}"
    - settings

Вот вывод:

  • with_items: я получаю ошибку with_items expects a list or a set
  • with_nested: я вижу информацию верхнего уровня ( например, msg: {{ item }} выводит массив app1, app2 et c)
  • with_subelements: я получаю ошибку subelements lookup expects a dictionary, got 'None'

Это возможно / вероятно что способ, которым я установил переменную в первом случае, неверен. Если есть лучший способ сделать это, изменить его не проблема.

1 Ответ

2 голосов
/ 06 января 2020

Вы не можете использовать with_subelements, потому что settings - это словарь, а не список. Если бы вы реструктурировали свои данные таким образом, чтобы settings представлял собой список, например, так:

applications:
  - name: app1
  - name: app2
  - name: app3
  - name: app4
    settings:
      - name: log_dir
        value: /var/logs/app4
      - name: associated_files
        value:
          - auth/key.json
  - name: app5
    settings:
      - name: log_dir
        value: /var/logs/app5
      - name: repo_path
        value: new_apps/app5

Затем вы могли бы написать что-то вроде следующего, чтобы выполнить итерации по каждому параметру для каждого приложения:

---
- hosts: localhost
  gather_facts: false
  vars_files:
    - applications.yml
  tasks:
    - debug:
        msg: "set {{ item.1.name }} to {{ item.1.value }} for {{ item.0.name }}"
      loop: "{{ applications|subelements('settings', skip_missing=true) }}"
      loop_control:
        label: "{{ item.0.name }}.{{ item.1.name }} = {{ item.1.value }}"

(я использую loop_control здесь только для того, чтобы сделать вывод более приятным.)

Используя данные примера, которые вы разместили в applications.yml, вы получите вывод:


PLAY [localhost] *********************************************************************

TASK [debug] *************************************************************************
ok: [localhost] => (item=app4.log_dir = /var/logs/app4) => {
    "msg": "set log_dir to /var/logs/app4 for app4"
}
ok: [localhost] => (item=app4.associated_files = ['auth/key.json']) => {
    "msg": "set associated_files to ['auth/key.json'] for app4"
}
ok: [localhost] => (item=app5.log_dir = /var/logs/app5) => {
    "msg": "set log_dir to /var/logs/app5 for app5"
}
ok: [localhost] => (item=app5.repo_path = new_apps/app5) => {
    "msg": "set repo_path to new_apps/app5 for app5"
}

PLAY RECAP ***************************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...