Вложенный l oop со сравнением значений в Ansible - PullRequest
1 голос
/ 17 июня 2020

в примере ниже, как мне получить оценку студентов, перечисленных в selected_students_list? Мне нужно обработать оценку студента. В других языках программирования я могу использовать вложенные циклы, но я немного не понимаю, как это реализовать в Ansible

---
- name: Test
  hosts: localhost
  vars:
    - all_students_list:
      - {
          name: "Charlie",
          grade: 9,
        }
      - {
          name: "Alice",
          grade: 8,
        }
      - {
          name: "Bob",
          grade: 7,
        }
      - {
          name: "Darla",
          grade: 10,
        }
      - {
          name: "Edith",
          grade: 11,
        }
    - selected_students_list:
       - Alice
       - Bob
  tasks:
    - name: Process selected students
      debug: 
        msg: "<PROCESS THE GRADE OF SELECTED STUDENTS i.e. Alice and Bob>"
      with_nested:
        -  "{{ all_students_list }}"
        -  "{{ selected_students_list }}"

Ответы [ 2 ]

1 голос
/ 17 июня 2020

Можно либо перечислить выбранных студентов элемент за элементом. Например,

    - name: Process selected students
      debug:
        msg: "PROCESS THE GRADES [{{ item.grade }}]
              OF SELECTED STUDENT {{ item.name }}"
      loop: "{{ all_students_list|
                selectattr('name', 'in', selected_students_list)|
                list }}"

дает

  msg: PROCESS THE GRADES [8] OF SELECTED STUDENT Alice
  msg: PROCESS THE GRADES [7] OF SELECTED STUDENT Bob

Или, чтобы отобразить весь список сразу. Например,

    - name: Process selected students
      debug:
        msg: "{{ msg.split('\n')[:-1] }}"
      vars:
        my_list: "{{ all_students_list|
                     selectattr('name', 'in', selected_students_list)|
                     list }}"
        msg: |
          PROCESS THE GRADES OF SELECTED STUDENTS
          {{ my_list|to_yaml }}

дает

  msg:
  - PROCESS THE GRADES OF SELECTED STUDENTS
  - '- {grade: 8, name: Alice}'
  - '- {grade: 7, name: Bob}'


Если данные находятся в словаре, а не в списке, листинг элемента за элементом очень прост. Например,
- name: Test
  hosts: localhost
  vars:
    - all_students_dict:
        Charlie:
          grade: 9
        Alice:
          grade: 8
        Bob:
          grade: 7
        Darla:
          grade: 10
        Edith:
          grade: 11
    - selected_students_list:
       - Alice
       - Bob
  tasks:
    - name: Process selected students
      debug:
        msg: "PROCESS THE GRADES [{{ all_students_dict[item].grade }}]
              OF SELECTED STUDENT {{ item }}"
      loop: "{{ selected_students_list }}"

дает

  msg: PROCESS THE GRADES [8] OF SELECTED STUDENT Alice
  msg: PROCESS THE GRADES [7] OF SELECTED STUDENT Bob

Можно использовать фильтры dict2items и items2dict для создания словаря выбранных студентов. Например,

    - name: Process selected students
      debug:
        msg: "{{ msg.split('\n')[:-1] }}"
      vars:
        my_dict: "{{ all_students_dict|
                     dict2items|
                     selectattr('key', 'in', selected_students_list)|
                     list|
                     items2dict }}"
        msg: |
          PROCESS THE GRADES OF SELECTED STUDENTS
          {{ my_dict|to_yaml }}

дает

  msg:
  - PROCESS THE GRADES OF SELECTED STUDENTS
  - 'Alice: {grade: 8}'
  - 'Bob: {grade: 7}
1 голос
/ 17 июня 2020

Это должно быть

 vars:
    ...
    query: "[?name == `{{ item }}`].grade"
 tasks:
    - name: Process selected students
      debug:
        msg: "{{ all_students_list | json_query(query) }}"
      loop:  "{{ selected_students_list }}"

Проверьте json -query-filter для получения дополнительных сведений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...