Изменить переменную в шаблоне Ansible на основе группы

У меня есть файл инвентаризации Ansible примерно так:

[es-masters]
host1.my-network.com

[es-slaves]
host2.my-network.com
host3.my-network.com

[es:children]
es-masters
es-slaves

У меня также есть файл шаблона Jinja2, которому необходимо установить определенное значение "true", если хост принадлежит к группе "es-masters".

Я уверен, что есть простой способ сделать это, но после некоторого поиска в Google и чтения документации у меня ничего не вышло.

Я ищу что-то простое и программное, подобное этому, чтобы войти в шаблон Jinja2:

{% if hostvars[host][group] == "es-masters" %}
node_master=true
{% else %}
node_master=false
{% endif %}

Любые идеи?


person Charles Newey    schedule 28.08.2014    source источник
comment
Вы передаете hostvars функции рендеринга или ожидаете, что jinja2 сможет получить доступ к hostvars?   -  person Andrew Kloos    schedule 28.08.2014
comment
На самом деле это был просто пример - то, что я действительно ищу, - это программный способ увидеть группы, членом которых является конкретный хост, и найти способ изменить переменную в шаблоне на основе этого.   -  person Charles Newey    schedule 29.08.2014
comment
Документы. Помимо хранения переменных непосредственно в файле INI, переменные хоста и группы могут храниться в отдельных файлах относительно файла инвентаризации. Эти файлы переменных имеют формат YAML. См. Синтаксис YAML, если вы новичок в YAML. Библиотека YAML входит в состав AppEngine SDK.   -  person voscausa    schedule 29.08.2014


Ответы (4)


Вы делаете наоборот. Вы проверяете, находится ли идентификатор (имя хоста или IP или что-то еще в вашем инвентаре) в определенной группе. Нет, если группа находится в hostvars.

{% if ansible_fqdn in groups['es-masters'] %}
node_master=true
{% else %}
node_master=false
{% endif %}

Но вам лучше сделать следующее:

Укажите значение по умолчанию в шаблоне

# role_name/templates/template.j2
node_master={{ role_name_node_master | default(true) }}

Чем переопределить в group_vars

# group_vars/es-masters.yml
role_name_node_master: false
person t2d    schedule 12.09.2014
comment
Как расширить ответ на группы с детьми, размещенные в stackoverflow.com/questions/42955303/ - person Chris F; 22.03.2017

Если ваш инвентарь не идентифицирует хосты с помощью ansible_fqdn, ansible_hostname и т. Д., Вы также можете использовать group_names, чтобы проверить, есть ли у текущего хоста «es-masters» в качестве одной из его групп.

{% if 'es-masters' in group_names %}
node_master=true
{% else %}
node_master=false
{% endif %}

См. https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html#accessing-information-about-other-hosts-with-magic-variables

person Maggie    schedule 17.07.2017

Чтобы избежать ошибки с несуществующей группой, вы должны сначала проверить, существует ли группа:

{% if 'es-masters' in group_names and ansible_fqdn in groups['es-masters'] %}
node_master=true
{% else %}
node_master=false
{% endif %}
person panticz    schedule 07.02.2018

{% if ansible_fqdn in groups['es-masters'] %}
    {% set node_master=true %}
{% else %}
    {% set node_master=false %}
{% endif %}

может так? измените переменную с именем node_master, а не используйте txt

person 张馆长    schedule 03.02.2021