Ansible: Извлечение данных из инвентаризации

#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 согласованы