Ansible jinja отфильтровывает элементы с атрибутом, не равным чему-либо, ИЛИ атрибут отсутствует - PullRequest
0 голосов
/ 07 января 2019

У меня есть несколько задач, подобных этой:

- ec2_asg_facts:
    region: us-west-2
    tags:
      Name: my-asg
  register: asg
- set_fact:
    current_lc: "{{ asg.results | map(attribute='launch_configuration_name') | first }}"
    instances: "{{ asg.results | map(attribute='instances') | flatten | list }}"
- set_fact:
    instances_to_rotate: "{{ instances | rejectattr('launch_configuration_name', 'equalto', current_lc) | list }}"

Проблема заключается в том, что если удаляется конфигурация запуска для экземпляров (что часто имеет место, когда я обновляю конфигурацию запуска для ASG на новую, но еще не завершил работу старых экземпляров), launch_configuration_name атрибут отсутствует, поэтому третье задание не выполняется с сообщением 'dict object' has no attribute 'launch_configuration_name'. Как отфильтровать элементы в списке instances, у которых атрибут launch_configuration_name не равен current_lc ИЛИ отсутствует атрибут launch_configuration_name?

1 Ответ

0 голосов
/ 07 января 2019

Ответ состоит в том, чтобы фильтровать в два прохода; сначала отфильтруйте элементы, атрибут которых не определен, а затем отфильтруйте те, где атрибут не равен current_lc.

- set_fact:
    instances_to_rotate: "{{ instances | rejectattr('launch_configuration_name', 'undefined') | rejectattr('launch_configuration_name', 'equalto', current_lc) | list }}"
...