Как проверить, присутствует ли элемент в массиве 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