Доступ к переменной хоста инвентаря в недоступном playbook

Я использую возможность 2.1. У меня есть следующий файл хоста инвентаризации и роль, вызываемая игрой, которая нуждается в доступе к переменной файла хоста. Любые мысли о том, как получить к нему доступ (в настоящее время возникает ошибка):

файл хоста

[test1]
test-1 ansible_ssh_host=abc.def.ghi.jkl ansible_ssh_port=1212

[test2]
test2-1 ansible_ssh_host=abc.def.ghi.mno ansible_ssh_port=1212

[test3]
test3-1 ansible_ssh_host=abc.def.ghi.pqr ansible_ssh_port=1212
test3-2 ansible_ssh_host=abc.def.ghi.stu ansible_ssh_port=1212

[all:children]
test1
test2
test3

роль Я попытался получить доступ к роли в следующих моделях:

{{ hostvars.ansible_ssh_host }} 

& &

{{ hostvars.test1.ansible_ssh_host }}

Я пытаюсь получить доступ к ansible_ssh_host в разделе test1.

Ошибка

fatal: [localhost]: FAILED! => {"failed": true, "msg": "'ansible.vars.hostvars.HostVars object' has no attribute 'ansible'"}

Ответ 1

Вы на правильном пути о hostvars.
Эта магическая переменная используется для доступа к информации о других хостах.

hostvars - это хэш с hostvars хостов инвентаризации в качестве ключей.
Чтобы получить доступ к полям каждого хоста, используйте hostvars['test-1'], hostvars['test2-1'] и т.д.

ansible_ssh_host устарела в пользу ansible_host начиная с 2.0.
Поэтому вы должны сначала удалить "_ssh" из аргументов узлов инвентаризации (то есть стать "ansible_user", "ansible_host" и "ansible_port"), а затем в своей роли вызвать его с помощью:

{{ hostvars['your_host_group'].ansible_host }}

Ответ 2

[host_group]
host-1 ansible_ssh_host=192.168.0.21 node_name=foo
host-2 ansible_ssh_host=192.168.0.22 node_name=bar

[host_group:vars]
custom_var=asdasdasd

Вы можете получить доступ к группам хостов, используя:

{{ hostvars['host_group'].custom_var }}

Если вам нужно конкретное значение с определенного хоста, вы можете использовать:

{{ hostvars[groups['host_group'][0]].node_name }}

Ответ 3

Вы должны иметь возможность использовать имя переменной напрямую

ansible_ssh_host

Или вы можете пройти через hostvars без указания хоста буквально с помощью волшебной переменной inventory_hostname

hostvars[inventory_hostname].ansible_ssh_host

Ответ 5

Привет у меня есть похожая проблема. Я использую Ansible 2.7.6

Я разверну разные шары tar на n сервере и создам задание cron с другой конфигурацией. Я планирую сделать переменную для версии, config_name и времени начала в моем инвентаре.

Мой инвентарный файл:

[tar ball deploy]
server_a version=4.1.0 config_name=abc minute=00 hour=07
server_b version=4.1.1 config_name=abc minute=00 hour=08
server_c version=4.1.2 config_name=abc minute=50 hour=07

Я пытался с различными циклами, переменными, indexed_itms, но это не удается, кто-нибудь есть решение?

Ответ 6

Я тоже боролся с этим. Моя конкретная настройка: Ваш host.ini (с современными именами):

[test3]
test3-1 ansible_host=abc.def.ghi.pqr ansible_port=1212
test3-2 ansible_host=abc.def.ghi.stu ansible_port=1212

плюс игра fill_file.yml

---
- remote_user: ec2-user
  hosts: test3
  tasks:
   - name: fill file
     template:
       src: file.j2
       dest: filled_file.txt

плюс шаблон file.j2, вроде

{% for host in groups['test3'] %}
   {{ hostvars[host].ansible_host }}
{% endfor %}

Это сработало для меня, результат

abc.def.ghi.pqr
abc.def.ghi.stu

Я должен признать, что это ответственно 2.7, а не 2.1. Шаблон представляет собой вариант примера в https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html.

Принятый ответ не работал в моей настройке. С шаблоном

{{ hostvars['test3'].ansible_host }}

моя игра терпит неудачу с "AnsibleUndefinedVariable: \" hostvars ['test3']\"не определено".

Примечание: я попробовал некоторые варианты, но не получилось, иногда с "ansible.vars.hostvars.HostVars объект не имеет элемента"; Отчасти это можно объяснить тем, что они говорят. в https://github.com/ansible/ansible/issues/13343#issuecomment-160992631

hostvars эмулирует словарь [...]. hostvars также лениво загружается

Ответ 7

Большое спасибо, эта записка была очень полезна для меня! Был в состоянии отправить переменную, определенную в /group_var/vars в ANSIBLE playbook, как указано ниже.

задачи:
- имя: проверить срок действия пароля учетной записи службы
- команда:

sh /home/monit/get_ldap_attr.sh {{ item }} {{ LDAP_AUTH_USR }}