LINUX.ORG.RU
ФорумAdmin

Как в Ansible отфильтровать список в with_items ?

 ,


0

1

У меня имеется список репозитариев, который сделан примерно так:

gitRepos
- [ true,  "doxygen_documentation.git", "master", "doxygen_doc"  ]
- [ false, "idk.git",                   "qt5",    "idk"          ]
- [ true,  "binke.git",                 "master", "binke_plugin" ]
...

Чтобы делать действия с репозитариями, используется with_items по данному списку. Раньше в этом списке не было первого столбца true/false, и действия выполнялись для всех элементов списка gitRepos:
- name: Создание/обновление репозитариев
  git: repo="{{ item[nRepoNetworkPath] }}" dest="{{ gitReposPath }}/{{ item[nDirectoryName] }}"
  with_items:
  - "{{ gitRepos }}"

Теперь появился первый столбец, и в with_items надо прописать фильтр, который уберет строки, в которых первый элемент равен false. Условие when использовать нежелательно, так как в нем используются условия по другим переменным, и будет очень заморочено.

Но я читаю документацию:

https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_filters.html

И не вижу там возможности фильтровать/преобразовывать список так, чтобы в нем исключить элементы по условию. Как это можно сделать?

★★★★★

Последнее исправление: Xintrea (всего исправлений: 1)

Ответ на: комментарий от Xintrea

Я над ответом ещё до правки стал размышлять.

Может, эти примеры больше подойдут:

https://stackoverflow.com/questions/31895602/ansible-filter-a-list-by-its-att...

Без полного playbook не буду судить, но кажется, структура неоправданно перегруженная, её бы раздробить.

NDfan
()

ну, и опять же, можно свой фильтр написать под себя, как тут

типа такого

def exclude_disabled_repos(repolist):
    return [repo for repo in repolist if repo[0] == True]


class FilterModule(object):
    def filters(self):
        return {
            'exclude_disabled_repos': exclude_disabled_repos
        }

в плейбуке - {{ gitRepos|exclude_disabled_repos }}

CaHbl4
()
Ответ на: комментарий от CaHbl4

Да, я к этому же решению и пришел. Но думал может готовый фильтр имеется, а ничего внятного для фильтрации списка по условию в Ansible не обнаружил. Это странно. Видимо, все отдано на откуп when.

Xintrea ★★★★★
() автор топика

список репозитариев, который сделан примерно так

Нужно работать не со списком списков, а со списком словарей. И тогда можно фильтровать в loop как заблагорассудится.

Если создаёшь описание сам, лучше сразу описывать так, чтобы потом не создавать проблемы на ровном месте. Если список создаётся фильтрами, значит нужно переписать фильтры.

ivanov17
()