#ansible #ansible-2.x #ansible-inventory #ansible-facts
Вопрос:
Мне нужно получить IP-адрес bob_server из файла инвентаризации. Я не совсем понимаю, какую комбинацию использовать в filter
, lookup
, и when
? В зависимости от файла инвентаризации bob_server
и alice_server
имен могут меняться, но app_type
не будут меняться. Моя логика игры явно неверна, может ли кто-нибудь подсказать мне правильный способ получения IP-адреса, когда app_type = bob
Мой текущий файл инвентаризации:
---
all:
hosts:
children:
bob_server:
hosts: 10.192.2.6
vars:
app_type: bob
alice_server:
hosts: 10.192.2.53
vars:
app_type: alice
Мой Сборник Пьес
---
- hosts: localhost
name: Retrive data
tasks:
- name: Set Ambari IP
set_fact:
ambariIP: "{{ lookup('hosts', children) }}"
when: "hostvars[app_type] == 'bob'"
Комментарии:
1. Ваш файл инвентаризации недействителен. Пожалуйста, обратитесь к документации и исправьте это. Более того, вы, кажется, путаете понятие группы и хозяина. Это также объясняется в документации. Как только все это будет исправлено, вам не понадобится никакой сложный поиск: использование
inventory_hostname
илиansible_host
(в зависимости от того, как вы назовете свои хосты) даст вам ожидаемые данные.2. Да, концепция группы и хоста сбивает с толку. Но нет, опись не является недействительной. Смотрите ниже,
ansible-inventory -i hosts-01 --list
работает нормально. Думаю, нет причин закрываться. Это хороший пример того, как (не) использовать (все еще действующий) формат инвентаризации YAML .
Ответ №1:
Учитывая опись
shell> cat hosts-01
---
all:
hosts:
children:
bob_server:
hosts: 10.192.2.6
vars:
app_type: bob
alice_server:
hosts: 10.192.2.53
vars:
app_type: alice
Простой вариант заключается в использовании ansible-inventory
, например
- hosts: localhost
tasks:
- command: ansible-inventory -i hosts-01 --list
register: result
- set_fact:
my_inventory: "{{ result.stdout|from_yaml }}"
- debug:
var: my_inventory.bob_server.hosts
дает
my_inventory.bob_server.hosts:
- 10.192.2.6
Если вы хотите проанализировать файл самостоятельно, прочитайте его в словаре и выровняйте пути, например (установите ansible.utils ansible-galaxy collection install ansible.utils
)
- include_vars:
file: hosts-01
name: my_hosts
- set_fact:
my_paths: "{{ lookup('ansible.utils.to_paths', my_hosts) }}"
- debug:
var: my_paths
дает
my_paths:
all.children.alice_server.hosts: 10.192.2.53
all.children.alice_server.vars.app_type: alice
all.children.bob_server.hosts: 10.192.2.6
all.children.bob_server.vars.app_type: bob
all.hosts: null
Теперь выберите клавиши, заканчивающиеся bob_server.hosts
- set_fact:
bob_server_hosts: "{{ my_paths|
dict2items|
selectattr('key', 'match', '^.*bob_server\.hosts
дает
bob_server_hosts:
all.children.bob_server.hosts: 10.192.2.6
и выберите IP-адреса
- set_fact:
bob_server_ips: "{{ bob_server_hosts.values()|list }}"
дает
bob_server_ips:
- 10.192.2.6
В описи отсутствует понятие групп. См. раздел Основы инвентаризации: форматы, хосты и группы. Обычно значением children
является группа хостов. В этом инвентаре значение children
- это один хост. Это концептуально неверно, но все еще справедливо, например
- hosts: bob_server
gather_facts: false
tasks:
- debug:
var: inventory_hostname
дает
shell> ansible-playbook -i hosts-01 playbook.ym
...
TASK [debug] ****************************************************
ok: [10.192.2.6] =>
inventory_hostname: 10.192.2.6
Комментарии:
1. Спасибо за объяснение, проблема в моем случае в том, что инвентарь динамичен. Кроме того, bob_server и Alice_server также динамичны, только
app_type
согласованы
)|
items2dict }}"
дает
и выберите IP-адреса
дает
В описи отсутствует понятие групп. См. раздел Основы инвентаризации: форматы, хосты и группы. Обычно значением children
является группа хостов. В этом инвентаре значение children
— это один хост. Это концептуально неверно, но все еще справедливо, например
дает
Комментарии:
1. Спасибо за объяснение, проблема в моем случае в том, что инвентарь динамичен. Кроме того, bob_server и Alice_server также динамичны, только
app_type
согласованы