Задать вопрос
@kaN5300

Ansible: как вытащить ip-адрес хоста с которым идёт взаимодействие в переменную?

Добрый день. В процессе знакомства с Ansible (2.9.2) решаю практическую задачу - генерацию конфига zabbix-агента для группы типовых машин (Debian 10). В j2-темплейте конфига планируется всего лишь одна переменная. Это listen ip. На удалённых машинах может быть множество сетевых интерфейсов (тысячи) и мне бы очень не хотелось выполнять процедуру gether_facts полностью, а ограничиться каким-то подмножеством типа env. К тому же, даже если получать полный перечень интерфейсов, не понятно какую применять логику для вычленения именно того ip-адреса который мне нужен. По сути, всё что мне нужно это получить переменную содержащую IP-адрес SSH-сервера с которым в данный момент взаимодействует Ansible. В процессе гугления я наткнулся на статью где в точности был описан мой кейс. И целых три подхода по решению проблемы:

https://www.middlewareinventory.com/blog/ansible-g...

Я решил остановиться на методе №1:

---
- hosts: all
  gather_facts: yes
  tasks:
    - debug: var=hostvars[inventory_hostname]['ansible_env'].SSH_CONNECTION.split(' ')[2]


В результате прогона плейбука получаю сообщения о том что переменная не определена:

TASK [debug] *********************************************************************************************************************************************************************************
ok: [host1] => {
    "hostvars[inventory_hostname]['ansible_env'].SSH_CONNECTION.split(' ')[2]": "VARIABLE IS NOT DEFINED!"
}


Даже при таком плейбуке результат не меняется.

---

- hosts: my_group
  become: true
  gather_facts: yes
  pre_tasks:
    - setup:
        gather_subset: 'all'
  tasks:
    - debug: var=hostvars[inventory_hostname]['ansible_env'].SSH_CONNECTION.split(' ')[2]


Если выводе дебага урезать до 'var=hostvars[inventory_hostname]' и грепнуть SSH_CONNECTION то ничего обнаружено не будет. Гугление "ansible env SSH_CONNECTION" положительных результатов не дало, что привело меня сюда.
  • Вопрос задан
  • 1360 просмотров
Подписаться 1 Средний Комментировать
Решения вопроса 1
@kaN5300 Автор вопроса
Выяснилось что исполнении руками через бинарник ansible на локалхост (ansible localhost -m setup -a 'gather_subset=min') находится то что нужно. После того как я внимательно перечитал вывод своего плейбука и сравнил с тем что получил перед этим выяснилось что become: true мешает процессу получения IP. Рабочий плейбук в результате оказался таким:

---

- hosts: localhost
  become: false
  gather_facts: no
  pre_tasks:
    - setup:
        gather_subset: 'min'
  tasks:
    - debug: var=hostvars[inventory_hostname]['ansible_env'].SSH_CONNECTION.split(' ')[2]


Причина потерянного времени - невнимательность. Надеюсь, эта информация окажется для кого-то полезной.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы