Ansible: нет фильтра с именем «selectattr»

Я совершаю набег на мир 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

Любая помощь в этом очень ценится.


person Black Dynamite    schedule 10.02.2018    source источник
comment
selectattr доступен, начиная с Jinja2 2.7+, поэтому кажется, что в вашей системе может быть какой-то беспорядок с пакетами Python, поэтому Ansible использует неправильный Jinja2.   -  person Konstantin Suvorov    schedule 10.02.2018
comment
Независимо от того, какое сообщение об ошибке selectattr вы получите, selectattr('stat','false') не имеет смысла. См. пример.   -  person techraf    schedule 10.02.2018
comment
Пожалуйста, не добавляйте ответ на вопрос. Вы можете ответить на свой вопрос.   -  person techraf    schedule 10.02.2018


Ответы (2)


Я установил Jinja2, используя «pip install jinja2». Что мне нужно было сделать, так это

'sudo yum install python-jinja2' 

чтобы все заработало.

person Black Dynamite    schedule 10.02.2018

Попробуй это:

- 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', 'defined') | map(attribute='stat') | selectattr('exists', 'equalto', false) | list | length > 0
person xbalaji    schedule 10.02.2018