Ansible: Как отфильтровать dict2items и запустить playbook только для совпадающих значений - PullRequest
1 голос
/ 04 августа 2020

У меня есть сценарий dict, который выглядит следующим образом:

  x_php_versions_installed:
      ea-php71:
        - ea-php71-php-bcmath
        - ea-php71-php-xmlrpc
        - ea-php71-php-zip
        - pecl-memcached
        - pecl-imagick
      ea-php72:
        - ea-php72-php-cli
        - ea-php72-php-common
        - ea-php72-php-curl
        - pecl-imagick

Я хотел бы их отфильтровать, чтобы записать мне каждое item.value, которое содержит строку «ea», но не все остальное. Моя задача выглядит так:

- name: Write out only the ea packages
  debug:
    msg: '{{ item.value }}'
  when: item.value | selectattr(item.value, 'contains', 'ea')
  loop: '{{ x_php_versions_installed | dict2items }}

Но это не работает, потому что в нем будут перечислены все пакеты, а не только ea. Ожидаемый ответ должен выглядеть так:

...
"msg": [
    "ea-php71-php-bcmath",
    "ea-php71-php-xmlrpc",
    "ea-php71-php-zip"
]
...
"msg": [
    "ea-php72-php-cli",
    "ea-php72-php-common",
    "ea-php72-php-curl"
]
...

Другая возможность - отфильтровать строку 'pecl', она даст мне тот же результат, и она также отлично работает.

1 Ответ

2 голосов
/ 04 августа 2020

Q: значение фильтра, которое содержит 'ea'

A: Задача ниже выполняет задание

    - debug:
        msg: "{{ item.value|select('match','^ea-(.*)$')|list }}"
      loop: "{{ x_php_versions_installed|dict2items }}"

дает

  msg:
  - ea-php71-php-bcmath
  - ea-php71-php-xmlrpc
  - ea-php71-php-zip

  msg:
  - ea-php72-php-cli
  - ea-php72-php-common
  - ea-php72-php-curl

Q: отфильтровать строку 'pecl'

A: Измените фильтр на reject и установите регулярное выражение . Например, приведенная ниже задача дает тот же результат

    - debug:
        msg: "{{ item.value|reject('match','^pecl-(.*)$')|list }}"
      loop: "{{ x_php_versions_installed|dict2items }}"
...