Как проверить, присутствует ли элемент в массиве Ansible?
предположим, у меня есть следующий пример, хранящий все git config
значения в Ansible переменной:
- shell: git config --global --list
register: git_config_list
Ansible сохраняет результат этой команды в git_config_list
переменная, и один из элементов -stdout_lines
, содержащий вывод команды в массиве записей, например
[
"user.name=Foo Bar",
"user.email=foo@example.com"
]
как я могу проверить, установлено ли уже определенное значение, например, для проверки этого user.name
имеет значение?
есть ли способ назвать что-то вроде contains
на массив в сочетании с регулярным выражением позволяет мне найти значение, которое я ищу? Или мне нужно сделать петлю над stdout_lines
записи, чтобы найти то, что я ищу?
пример того, как сделать что-то подобное, будет оценен.
2 ответов
теоретически это должно быть возможно путем объединения фильтров match
и select
. Последний возвращает только те элементы списка, которые проходят фильтр. Затем вы можете проверить длину результата.
в теории. Я только что проверил его и не могу заставить работать. В общем то select
(а также reject
фильтр) возвращает строку типа <generator object _select_or_reject at 0x10531bc80>
даже с простыми фильтрами, такими как пример из документов с odd
. Не смог найди решение. Может быть, у вас больше успеха.
хотя вы могли бы просто join
ваш список в строку, а затем поиск в строке с match
. Пока это уродливо, это работает.
git_config_list.stdout_lines | join("|") | match("user.name=[^|]+")
простой python in
было бы хорошо, обратите внимание, что я использую stdout
вместо stdout_lines
:
- debug: git_config_list contains user.name
when: "'user.name=' in '{{git_config_list.stdout}}'"
все ansible
- это ужасно для программирования. Старайтесь делать как можно больше за пределами playbook и писать только логику оркестровки внутри playbook. Вот несколько примеров, как вы можете сделать это с помощью на git
.
- hosts: localhost
tags: so
gather_facts: False
tasks:
- shell: git config --global --get user.name
register: g
changed_when: False
failed_when: False
- debug: msg="config has user.name"
when: "0 == {{g.rc}}"
- hosts: localhost
tags: so
gather_facts: False
tasks:
- name: assert user.name is set
shell: git config --global --get user.name
changed_when: False
# git config --global --unset user.name
# ansible pb.yml -t so
# git config --global --add user.name 'Kashyap Bhatt'
# ansible pb.yml -t so