Доступ к переменной хоста инвентаря в недоступном 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
Ответ 4
Я также нашел хороший и простой способ решения hostsvars прямо в одной из проблем Ansible Github.
Похоже, вы тоже можете сделать это:
- debug:
msg: "{{ 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 }}