Ansible проверяет, существует ли значение в списке словарей

#ansible #jinja2

#ansible #jinja2

Вопрос:

Ниже приведен мой список переменных

 hostlist:
  - { name: 'host1', ip_addr: '192.168.2.31', hostgrp: 'physical_workstation' }
  - { name: 'host2', ip_addr: '192.168.2.32', hostgrp: 'physical_workstation' }
  - { name: 'host3', ip_addr: '192.168.2.33', hostgrp: 'virtual_machine' }
 

Я указал ниже

 - name: Conditional test
  debug:
    msg: "hello world"
  when: hostlist|selectattr("name", "equalto", "host1")|list|length != 0
 

Это не работает, как показано ниже ошибка

 The error was: TemplateRuntimeError: no test named 'equalto'
 

Существует решение для улучшения Jinaj2. Но есть ли какой-либо другой метод вместо использования selectattr. Я не хочу обновлять Jinja2

Комментарии:

1. Ваше сообщение об ошибке не соответствует вашему коду. Ошибка гласит no test named 'equalto=' , что в вашем коде используется правильное имя теста equalto (с no = ).

2. Извините, когда я копировал и корректировал выравнивание, я случайно добавил =

Ответ №1:

Создайте список имен и проверьте, есть ли имя в списке, например

     - debug:
        msg: "hello world"
      loop:
        - 'host1'
        - 'host9'
      when: item in _names
      vars:
        _names: "{{ hostlist|map(attribute='name')|list }}"
 

выдает

 ok: [localhost] => (item=host1) => 
  msg: hello world
skipping: [localhost] => (item=host9)
 

Проверьте только host1

     - debug:
        msg: "hello world"
      when: "'host1' in _names"
      vars:
        _names: "{{ hostlist|map(attribute='name')|list }}"
 

выдает

 ok: [localhost] => (item=host1) => 
  msg: hello world
 

Комментарии:

1. спасибо за вашу идею. есть ли способ объединить его в одно условие when? я хотел бы проверить только host1

2. ДА. Это так. По какой-то причине вы должны заключить его в кавычки. Я добавил пример.

3. Да, то же самое. Я также попробовал ваш подход. То же самое, оно должно быть в кавычках