Я совершаю набег на мир Ansible. Прямо сейчас у меня есть задача, где я пытаюсь сказать:
Если какой-либо из списка файлов не существует, запустите эту задачу
Для этого у меня есть вот этот фрагмент кода.
- name: Check if certificate already exists.
stat:
path: /etc/letsencrypt/live/{{ item }}/cert.pem
with_items: "{{ cert_domains }}"
register: letsencrypt_cert
- name: Create the certs
raw: certbot --nginx --noninteractive -d "{{ cert_domains.0 }}" -d "{{ cert_domains.1 }}"
register: certbot_create
changed_when: certbot_create.stdout
when:
- "{{ letsencrypt_cert.results|selectattr('stat','false') | length > 0 }}"
Однако, когда я запускаю свой процесс, он встречает меня следующей ошибкой:
"msg": "The conditional check '{{
letsencrypt_cert.results|selectattr('stat','false') | length > 1 }}' failed.
The error was: template error while templating string: no filter named
'selectattr'. String: {{ letsencrypt_cert.results|selectattr('stat','false')
| length > 0 }}\
В чем-то вроде LINQ я бы сделал что-то вроде этого:
list.where( n => n.equals(false)).Count() > 0
Что может пойти не так?
Для полноты картины вот мои версии:
доступный 2.4.2.0
версия питона = 2.6.9
Название: Jinja2 Версия: 2.7.2
Любая помощь в этом очень ценится.
selectattr
доступен, начиная с Jinja2 2.7+, поэтому кажется, что в вашей системе может быть какой-то беспорядок с пакетами Python, поэтому Ansible использует неправильный Jinja2. - person Konstantin Suvorov   schedule 10.02.2018selectattr
вы получите,selectattr('stat','false')
не имеет смысла. См. пример. - person techraf   schedule 10.02.2018