Подтвердить что ты не робот

Неспособный - чтение узлов и переменных инвентаризации в файл 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. Пользователь может редактировать файл инвентаризации.

4b9b3361

Ответ 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