ansible — получить хост по переменной

#ansible #jinja2

#ansible #jinja2

Вопрос:

Я хотел бы фильтровать хосты по переменной, установленной для них. Например:

У меня есть группа хостов, один из которых является ведущим, остальные — подчиненные. На главном replica_type: master сервере установлена переменная. Теперь я хотел бы получить главный сервер динамически.

Мой рабочий подход:

 - set_fact:
    master_server_string: >-
      {% for server in groups.my_servers %}
      {% if hostvars[server]['replica_type']=='master' -%}
      {{ server }}
      {% endif %}
      {% endfor %}
- set_fact:
    master_server: "{{ master_server_string|trim }}"
  

Есть ли способ выполнить то же самое с фильтром (или, по крайней мере, в одной задаче)?
например, что-то вроде

 "{{ server for server in groups.my_servers if hostvars[server]['replica_type'] == 'master' }}"
  

Ответ №1:

Я полагаю, вы ищете group_by модуль. https://docs.ansible.com/ansible/latest/modules/group_by_module.html

 - group_by:
    key: {{ replica_type }}
  

Ответ №2:

Вы можете извлечь значение из группы хостов с помощью свойства, зациклив группу и проверив соответствие значения, подобного этому:

 - set_fact:
    master_server: "{{ item }}"
  with_items: "{{ groups.my_servers }}"
  when: hostvars[item].replica_type == 'master'
  

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

1. Это решение так же хорошо, как и принятое, просто еще одна возможность