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)

Условие when использовать нежелательно

насколько я знаю, по другому никак.

dada ★★★★★
()
Ответ на: комментарий от 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 ★★★★★
() автор топика

а ты отфильтруй через when в другой таске и создай нужный тебе список через set_fact

adn ★★★★
()

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

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

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

ivanov17
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.