Неспособный - чтение узлов и переменных инвентаризации в файл group_vars/all
У меня есть сомнительное сомнение, которое заставляет меня застрять надолго. У меня очень банальный файл инвентаря с хостами и переменными:
[lb]
10.112.84.122
[tomcat]
10.112.84.124
[jboss5]
10.112.84.122
...
[tests:children]
lb
tomcat
jboss5
[default:children]
tests
[tests:vars]
data_base_user=NETWIN-4.3
data_base_password=NETWIN
data_base_encrypted_password=
data_base_host=10.112.69.48
data_base_port=1521
data_base_service=ssdenwdb
data_base_url=jdbc:oracle:thin:@10.112.69.48:1521/ssdenwdb
Проблема заключается в том, что мне нужно получить доступ ко всем этим хостам и переменным в файле инвентаризации из файла group_vars/all.
Я пробовал следующие способы доступа к IP-адресу хоста:
{{ lb }}
"{{ hostvars[lb] }}"
"{{ hostvars['lb'] }}"
{{ hostvars[lb] }}
Чтобы получить доступ к переменной хоста, я попытался:
"{{ hostvars[tests].['data_base_host'] }}"
Все они ошибаются!!! Может ли кто-нибудь помочь мне найти наилучшую практику для доступа к хостам и переменным, а не из учебника, но из файла переменных?
EDIT:
Ok. Давайте уточним.
Проблема: используйте хост, объявленный в файле инвентаризации в файле переменных, скажем: group_vars/all.
Пример: у меня есть хост DB с IP:10.112.83.37
.
Файл инвентаризации:
[db]
10.112.83.37
В группе: vars/all file я хочу использовать этот IP для создания переменной.
group_vars/весь файл:
data_base_url=jdbc:oracle:thin:@{{ db }}:1521/ssdenwdb
В шаблоне я использую переменную, встроенную в файл group_vars/all.
Файл шаблона:
oracle_url = {{ data_base_url }}
Проблема заключается в том, что переменная {{ db }}
в файле group_vars/all не заменяется IP-адресом хоста DB. Пользователь может редактировать файл инвентаризации.
Ответы
Ответ 1
Если вы хотите программно получить доступ к инвентарным записям, чтобы включить их в задачу, например. Вы можете ссылаться на него следующим образом:
{{ hostvars.tomcat }}
Это возвращает вам структуру со всеми переменными, связанными с этим хостом. Если вам нужен только IP-адрес (или имя хоста), вы можете ссылаться на него следующим образом:
{{ hostvars.jboss5.ansible_ssh_host }}
Вот список переменных, на которые вы можете ссылаться: click. Кроме того, вы можете объявить переменную и установить ее, например, результат некоторого шага в учебнике.
- name: Change owner and group of some file
file: path=/tmp/my-file owner=new-owner group=new-group
register: chown_result
Затем, если вы выполните этот шаг на tomcat
, вы можете получить к нему доступ из jboss5
следующим образом:
- name: Print out the result of chown
debug: msg="{{ hostvars.tomcat.chown_result }}"
Ответ 2
- name: host
debug: msg="{{ item }}"
with_items:
- "{{ groups['tests'] }}"
Этот фрагмент кода выдаст сообщение:
'10.112.84.122'
'10.112.84.124'
as groups['tests']
в основном возвращает список уникальных IP-адресов ['10.112.84.122','10.112.84.124']
, тогда как groups['tomcat'][0]
возвращает 10.112.84.124
.
Ответ 3
На всякий случай, если проблема все еще существует,
Вы можете ссылаться на доступный инвентарь через переменные ‘hostvars’
, ‘group_names’
и ‘groups’
.
Пример:
Чтобы иметь возможность получать IP-адреса всех серверов в группе "mygroup", используйте следующую конструкцию:
- debug: msg="{{ hostvars[item]['ansible_eth0']['ipv4']['address'] }}"
with_items:
- "{{ groups['mygroup'] }}"
Ответ 4
Да пример от nixlike работает очень хорошо.
Инвентарь:
[docker-host]
myhost1 user=barbara
myhost2 user=heather
Playbook:
---
- hosts: localhost
connection: local
tasks:
- name: loop debug inventory hostnames
debug:
msg: "the docker host is {{ item }}"
with_inventory_hostnames: docker-host
- name: loop debug items
debug:
msg: "the docker host is {{ hostvars[item]['user'] }}"
with_items: "{{ groups['docker-host'] }}"
выход:
ansible-playbook ansible/tests/vars-test-local.yml
PLAY [localhost]
ЗАДАЧА [настройка] ************************************************** ***************** ok: [localhost]
TASK [имя хоста инвентаризации хостов] ****************************************** ОК: [localhost] = > ( item = myhost2) = > { "item": "myhost2", msg ":" хост докера - это myhost2 "} ok: [localhost] = > (item = myhost1) = > { "item": "myhost1", msg ":" хост докера - myhost1 "}
TASK [элементы отладки цикла] ************************************************** ****** ok: [localhost] = > (item = myhost1) = > { "item": "myhost1", msg ":" хост докера - barbara "} ok: [localhost] = > (item = myhost2) = > { "item": "myhost2", msg: "хост докера - это вереск"}
PLAY RECAP ************************************************** ******************* localhost: ok = 3 changed = 0 unreachable = 0
не удалось = 0
спасибо!
Ответ 5
Учитывая ваш предыдущий пример:
файл инвентаризации:
[db]
10.112.83.37
group_vars/все
data_base_url=jdbc:oracle:thin:@{{ db }}:1521/ssdenwdb
файл шаблона:
oracle_url = {{ data_base_url }}
Возможно, вы захотите заменить group_vars/all на
data_base_url="jdbc:oracle:thin:@{{ groups['db'][0] }}:1521/ssdenwdb"
Ответ 6
Если вы хотите иметь свои файлы в файлах под group_vars, просто переместите их здесь. Vars может быть в инвентаре (раздел [group: vars]), но также (и прежде всего) в файлах под group_vars
или hosts_vars
.
Например, в приведенном выше примере вы можете переместить ваши vars для группы tests
в файл group_vars/tests
:
Файл инвентаризации:
[lb]
10.112.84.122
[tomcat]
10.112.84.124
[jboss5]
10.112.84.122
...
[tests:children]
lb
tomcat
jboss5
[default:children]
tests
group_vars/tests
файл:
data_base_user=NETWIN-4.3
data_base_password=NETWIN
data_base_encrypted_password=
data_base_host=10.112.69.48
data_base_port=1521
data_base_service=ssdenwdb
data_base_url=jdbc:oracle:thin:@10.112.69.48:1521/ssdenwdb