Я хотел бы фильтровать хосты по установленной на них переменной. Например:
У меня есть группа хостов, один мастер, остальные рабы. На мастере установлена переменная 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' }}"
Я полагаю, вы ищете модуль group_by
.
https://docs.ansible.com/ansible/latest/modules/group_by_module.html
- group_by:
key: {{ replica_type }}
Вы можете извлечь значение из группы хостов по свойству, зациклив группу и проверив соответствующее значение, например:
- set_fact:
master_server: "{{ item }}"
with_items: "{{ groups.my_servers }}"
when: hostvars[item].replica_type == 'master'
Это решение так же хорошо, как и принятое, просто еще одна возможность