Каков синтаксис в regex_search () для сопоставления с переменной?
Ниже vcsourcekit = 10, я хочу сопоставить регулярное выражение ^ 10. Он не оценивает переменную, а интерпретирует буквально.
- name: Do something awesome
vmware_guest:
hostname: "{{ vcenterhostname }}"
...
when:
- item.key | regex_search('^(vcsourcekit)')
with_dict: "{{ vmfacts.virtual_machines }}"
Спасибо!
Не самое красивое, но это работает:
- item.key | regex_search('^' + vcsourcekit | string)
Без преобразования в строку я получаю cannot concatenate 'str' and 'int' objects
на ansible 2.2.0.0, и сейчас у меня нет времени обновляться.
Эта конкатенация работает без приведения:
when:
- item.key | regex_search('^(' ~ vcsourcekit ~ ')')
with_dict: "{{ vmfacts.virtual_machines }}"
(Проверено в Ansible 2.5.6)
Этот код:
tasks:
- set_fact:
keytype: ed25519
- set_fact:
matchstring: ".*_{{ keytype }}_.*"
- debug:
var: item
with_fileglob: "/etc/ssh/ssh_host_*_key"
when: not item is match(matchstring)
выбирает просто / etc / ssh / ssh_host_ed25519_key, что похоже на требование OP. Кажется, что для «соответствия» требуется шаблон, который соответствует всей строке, поэтому *. до и после этой строки для сопоставления.
Две отдельные строфы "set_fact" необходимы, чтобы "keytype" был установлен перед его использованием.
Код работает в Ansible 2.4.3.0 под управлением Debian 9 (Raspbian "Stretch").
Мое приложение требовало «не» в заявлении «когда», но оно не требовалось для ответа на исходный вопрос.
Для OP критическое заявление могло бы выглядеть так:
matchstring: "^vcsourcekit.*"
Очевидно, что уже слишком поздно помогать OP, но этот подход может помочь кому-то другому.
Лично я бы использовал что-то вроде
- item.key | regex_search('^%d' % vcsourcekit)
Кстати, это непроверено. Я также не уверен, соответствует ли это передовой практике Ansible / Jinja2.
РЕДАКТИРОВАТЬ: один из них (также непроверенный) мощь вернее.
- item.key | regex_search('^{0}'.format(vcsourcekit))
- item.key | regex_search('^%d' | format(vcsourcekit))