Ansible: как автоматически вызывать словарные ключи в цикле - PullRequest
1 голос
/ 10 марта 2020

как часть ansible автоматизации, существует файл переменной, генерируемый в следующем формате и сохраняемый как somedictvars.yml, и я могу использовать циклическое выполнение, если в задаче я указываю каждый ключ отдельно.

Но, так как он генерируется автоматически и количество ключей различается (иногда он может иметь одного сотрудника, а иногда может иметь более одной информации о сотруднике.), я ищу способ указать только префикс KEY, используемый в l oop.

somedictvars.yml

-  employee1:
    name: Martin D'vloper
    job: Developer
    skills:
      - python
      - perl
      - pascal
-  employee2:
    name: Tabitha Bitumen
    job: Developer
    skills:
      - lisp
      - fortran
      - erlang

my ansible playbook работает, как указано ниже, вручную определяя каждую клавишу dict var.

- name: include vars from YAML config files.
  include_vars: somedictvars.yml

- name: debug
  debug:
      msg: "{{ item.name }}"
  loop:
     - "{{ employee1 }}"
     - "{{ employee2 }}"

вывод: TASK [отладка]

*********************************************************************************************************************************************************************
ok: [UKXWD1EM01] => (item={u'skills': [u'python', u'perl', u'pascal'], u'job': u'Developer', u'name': u"Martin D'vloper"}) => {
    "msg": "Martin D'vloper"
}
ok: [UKXWD1EM01] => (item={u'skills': [u'lisp', u'fortran', u'erlang'], u'job': u'Developer', u'name': u'Tabitha Bitumen'}) => {
    "msg": "Tabitha Bitumen"
}

Пожалуйста, помогите, как использовать общее имя в l oop .. как employee[0-9], и если мой файл имеет 1 ключ, он будет напечатан в режиме отладки, и если он имеет 3 ключа, я буду напечатан только 3 ключа ['name'].

Иначе, пожалуйста, предложите, если я могу изменить формат файла на любой другой, чтобы соответствовать ansible. так что цикл может работать автоматически для любого числа переменных KEYs, доступных внутри файла.

Пожалуйста, помогите.

заранее спасибо.

1 Ответ

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

Считайте файл и создайте переменную employees. Задачи

    - slurp:
        src: somedictvars.yml
      register: somedictvars
    - set_fact:
        employees: "{{ somedictvars.content|b64decode|from_yaml }}"
    - debug:
        var: employees

дают

    "employees": [
        {
            "employee1": {
                "job": "Developer", 
                "name": "Martin D'vloper", 
                "skills": [
                    "python", 
                    "perl", 
                    "pascal"
                ]
            }
        }, 
        {
            "employee2": {
                "job": "Developer", 
                "name": "Tabitha Bitumen", 
                "skills": [
                    "lisp", 
                    "fortran", 
                    "erlang"
                ]
            }
        }
    ]

Есть и другие варианты действий.


1) Подгоните словари к цели. Задачи
    - set_fact:
        employees2: "{{ employees2|default([]) +
                        [{'employee': my_key.0}|combine(my_val.0)] }}"
      vars:
        my_key: "{{ item.keys()|list }}"
        my_val: "{{ item.values()|list }}"
      loop: "{{ employees }}"
    - debug:
        var: employees2

дают

    "employees2": [
        {
            "employee": "employee1", 
            "job": "Developer", 
            "name": "Martin D'vloper", 
            "skills": [
                "python", 
                "perl", 
                "pascal"
            ]
        }, 
        {
            "employee": "employee2", 
            "job": "Developer", 
            "name": "Tabitha Bitumen", 
            "skills": [
                "lisp", 
                "fortran", 
                "erlang"
            ]
        }
    ]

L oop в списке. Например,

    - debug:
          msg: "{{ item.name }}"
      loop: "{{ employees2 }}"

дать

    "msg": "Martin D'vloper"
    "msg": "Tabitha Bitumen"


2) Вместо изменения структуры словарей можно использовать json_query. Например,
    - debug:
        msg: "{{ item }}"
      loop: "{{ employees|json_query('[].*.name')|flatten }}"

дает тот же результат

    "msg": "Martin D'vloper"
    "msg": "Tabitha Bitumen"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...