Ansible динамический инвентарь для виртуальной машины Azure только с частным IP

В Azure у меня есть группа ресурсов с 1 виртуальной сетью, содержащей 2 сервера; мастер и рабочий. Только мастер имеет публичный IP.

Используя "простой" Ansible, я могу управлять обоими серверами, определяя частный IP-адрес рабочего как ansible_host в hosts файле и создавая group_vars файл с аргументами ssh ProxyCommand для подачи заявки на группу рабочего, как описано для jump host здесь (обратите внимание, что есть и более старые методы, которые включают прямую конфигурацию ssh, но подход group_vars предпочтительнее, я думаю, поскольку он более переносим для других пользователей).

Однако этот подход требует, чтобы IP-адреса были жестко запрограммированы, что не очень хорошо в Azure. Есть azure_rm скрипт инвентаризации или плагин (в зависимости от версии Ansible), который предоставит динамическая инвентаризация, позволяющая избежать необходимости в файле hosts, но как я могу в этом случае сделать эквивалент установки ProxyCommand?

Эта ситуация должна быть довольно распространенной, поэтому я чувствую, что что-то упускаю.


person lost    schedule 07.06.2019    source источник


Ответы (1)


Хозяева бастиона

Чтобы использовать прокси / хост бастиона / хост прыжка с Ansible, вам необходимо указать ansible_ssh_common_args в ansible.cfg.

  • Должна быть переменная среды ANSIBLE_SSH_COMMON_ARGS, но она отсутствует из-за этой проблемы Ansible - еще не исправлено в Ansible 2.9.3.

Вы можете установить это в статическом инвентаре на all уровне группы, чтобы поэкспериментировать с этим (проще попробовать это сначала без динамического инвентаря) - см. в этом блоге для получения дополнительных сведений.

[all:vars]
ansible_ssh_common_args='-o ProxyCommand="ssh -W %h:%p my-bastion.example.com"'

После того, как вы это заработаете, вы можете использовать динамический инвентарь - создайте файл group_vars/all.yml (сначала проверьте статический инвентарь), преобразовав указанный выше инвентарь в формате INI в YAML (измените = на :).

ansible_ssh_common_args: '-o ProxyCommand="ssh -W %h:%p my-bastion.example.com"'

Использование частных IP-адресов с динамической инвентаризацией

Чтобы убедиться, что ansible_host в выводе инвентаризации использует частный IP-адрес, вы должны использовать export AZURE_USE_PRIVATE_IP=true (с классическим azure_rm.py скриптом инвентаризации, еще не пробовал с инвентаризацией плагинов).

  • без этого ansible_host может иметь значение null или быть установленным как общедоступный IP / доменное имя.
  • вам это может не понадобиться, если вы используете доменные имена, которые разрешаются в частные IP-адреса.

Тестирование динамического инвентаря

Обязательно проверьте, что динамический инвентарь генерирует правильные данные JSON, прежде чем начинать использовать его для playbooks.

Чтобы проверить соответствие определенных значений инвентаризации правильным хостам, попробуйте:

$ AZURE_USE_PRIVATE_IP=true ansible -i azure_rm.py mygroup -m debug -a var=ansible_host
test01 | SUCCESS => {
    "ansible_host": "10.0.0.1"
}

Вы также можете проверить, что Ansible SSH работает следующим образом с -vvvvv при отладке:

$ AZURE_USE_PRIVATE_IP=trueansible -i azure_rm.py mygroup -m debug -a var=ansible_host
test01 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

Классический и подключаемый инвентарь

Здесь я использовал «классический» azure_rm.py динамический инвентарь - тот же подход работает с новым динамическим инвентарем на основе плагинов (начиная с Ansible 2.4, включает кеширование инвентаря).

Чтобы просмотреть выходные данные JSON динамической инвентаризации в любом режиме:

  • Классический: AZURE_USE_PRIVATE_IP=true python azure_rm.py | jq .
  • На основе плагина: ansible-inventory -i azure.yml --graph

Использование jq необязательно, оно просто форматирует вывод для удобства чтения.

person RichVel    schedule 21.11.2019