Проверьте, присутствуют ли все элементы из списка в другом списке с Ansible - PullRequest
0 голосов
/ 07 февраля 2020

Я ищу самый простой способ проверить, присутствуют ли все элементы из списка в другом большом списке, в Ansible.

Пример проверки того, что ['pkg_mgr', 'python'] оба присутствуют в ansible_facts.

Ответы [ 3 ]

2 голосов
/ 07 февраля 2020
when: "{{ ['pkg_mgr', 'python'] | difference(ansible_facts.keys()) | length == 0 }}"

Q: "Я не доволен тем, насколько ужасно это выглядит. Я был бы более чем рад видеть более чистые решения."

A: Пустой список оценивается как False в Ansible. Нет необходимости проверять длину списка. Ansible условие when расширяет выражение по умолчанию. Нет необходимости закрывать его в фигурных скобках. Эквивалентное условие:

when: not ['pkg_mgr', 'python']|difference(ansible_facts.keys())


Python3 возвращает dictionary view object вместо списка для методов dict.keys(), dict.values(), and dict.items(). Добавьте фильтр list, чтобы сделать код переносимым. См. словарь просмотров .
when: not ['pkg_mgr', 'python']|difference(ansible_facts.keys()|list)
1 голос
/ 07 февраля 2020

Мне удалось найти решение, которое работает, но я не доволен тем, насколько ужасно это выглядит.

- when: "{{ ['pkg_mgr', 'python'] | difference(ansible_facts.keys()) | length == 0 }}"
  ...

Я был бы очень рад увидеть более чистые решения.

0 голосов
/ 08 февраля 2020

Как насчет использования is subset?

Тест:

- name: "Check lists"
  hosts: localhost
  connection: local 
  tasks:
  - debug:
      msg: "{{ ['pkg_mgr', 'python'] is subset(ansible_facts.keys()) }}"
  - debug:
      msg: "{{ ['pkg_mgr', 'python', 'foo'] is subset(ansible_facts.keys()) }}"

Вывод:

PLAY [Check lists] *****************************************************************************************************************************************************************************************

TASK [Gathering Facts] *************************************************************************************************************************************************************************************
ok: [localhost]

TASK [debug] ***********************************************************************************************************************************************************************************************
ok: [localhost] => {
    "msg": true
}

TASK [debug] ***********************************************************************************************************************************************************************************************
ok: [localhost] => {
    "msg": false
}
...