Назад | Перейти на главную страницу

ansible: специальные переменные не определены при настройке на удаленный хост?

Я могу применить Ansible playbook локально с самого удаленного хоста и всех специальные переменные определены (и большинство из них не пустые). Однако, когда я применяю его на своем локальном компьютере с удаленным хостом в качестве цели, все они пусты. Я ожидал, что контекст должен быть идентичным с точки зрения этой удаленной машины в обоих случаях.

В частности, в playbook есть задача оболочки, которая пишет сценарий BASH. Это большая часть:

echo "#!/bin/sh" > /usr/local/bin/ml_provision_info
echo             >> /usr/local/bin/ml_provision_info

# Playbook info.
echo "echo 'Playbook Git revision: {{ ml_playbook_revision | default("<not provided>", true) }}'"  >> /usr/local/bin/ml_provision_info
echo "echo 'Playbook version (integer): {{ playbook_version }}'"                                   >> /usr/local/bin/ml_provision_info
echo "echo 'Playbook applied at: $(date)'"                                                         >> /usr/local/bin/ml_provision_info
echo "echo"                                                                                        >> /usr/local/bin/ml_provision_info
echo                                                                                               >> /usr/local/bin/ml_provision_info

# General Ansible context.
echo "echo 'VAR(ansible_dependent_role_names): {{ ansible_dependent_role_names | default([]) | join(',') }}'"  >> /usr/local/bin/ml_provision_info
echo "echo 'VAR(ansible_play_role_names): {{ ansible_play_role_names | default([]) | join(',') }}'"            >> /usr/local/bin/ml_provision_info
echo "echo 'VAR(ansible_role_names): {{ ansible_role_names | default([]) | join(',') }}'"                      >> /usr/local/bin/ml_provision_info
echo "echo 'VAR(ansible_run_tags): {{ ansible_run_tags | default([]) | join(',') }}'"                          >> /usr/local/bin/ml_provision_info
echo "echo 'VAR(ansible_skip_tags): {{ ansible_skip_tags | default([]) | join(',') }}'"                        >> /usr/local/bin/ml_provision_info
echo "echo 'VAR(group_names): {{ group_names | default([]) | join(',') }}'"                                    >> /usr/local/bin/ml_provision_info
echo "echo"                                                                                                    >> /usr/local/bin/ml_provision_info
echo                                                                                                           >> /usr/local/bin/ml_provision_info

Когда мы запускаем playbook из локального, специальные переменные имеют ожидаемые значения:

Playbook Git revision: 4967a0f8d249daa36b3a53e0d10d791502030a24
Playbook version (integer): 783
Playbook applied at: Wed Oct 23 01:39:44 UTC 2019

VAR(ansible_dependent_role_names): 
VAR(ansible_play_role_names): resolvconf,jenkins_slave,git,git_tools,kraken_modules,slave_netrc,gcc5.4.1,ntp,docker,guardicore,yaegashi.blockinfile,swarmclient,zabbix_agent,specifics
VAR(ansible_role_names): kraken_modules,git,git_tools,ntp,zabbix_agent,guardicore,specifics,slave_netrc,swarmclient,resolvconf,gcc5.4.1,jenkins_slave,docker,yaegashi.blockinfile
VAR(ansible_run_tags): all
VAR(ansible_skip_tags): 
VAR(group_names): ungrouped

Однако, когда мы запускаем его удаленно, большинство значений неопределенный:

Playbook Git revision: 4967a0f8d249daa36b3a53e0d10d791502030a24
Playbook version (integer): 783
Playbook applied at: Wed Oct 23 01:08:16 UTC 2019

VAR(ansible_dependent_role_names): 
VAR(ansible_play_role_names): 
VAR(ansible_role_names): 
VAR(ansible_run_tags): all
VAR(ansible_skip_tags): 
VAR(group_names): ungrouped

Что мне не хватает?

Не всегда легко понять, когда что-то изменилось в Ansible. Попробуем разобраться, когда был добавлен ansible_dependent_role_names!

Первый вариант

Обычно это лучший способ узнать, когда какой-то код был изменен, но он работает и для поиска var. Вары хоста генерируются lib / ansible / vars / hostvars.py
Мы можем использовать доступное репо или использовать GitHub, чтобы git blame.

https://github.com/ansible/ansible/blame/devel/lib/ansible/vars/hostvars.py

Поиск ansible_dependent_role_names дает:

Смотря на https://github.com/ansible/ansible/pull/46483 Здесь утверждается:

Поэтому мы вводим две новые магические переменные и переопределяем одну:

  • role_names теперь включает в себя все имена ролей, включая имена зависимостей. Наиболее распространенный вариант использования при проверке имен ролей - это проверить, влияет ли на целевой хост конкретная роль. Добавление зависимостей в этот список не нарушит эти варианты использования, а сделает их более точными.
  • play_role_names принимает на себя роль прежних role_names, только перечисляя явно перечисленные роли согласно игре. Если есть требование увидеть, настроена ли роль явно, можно использовать этот список.
  • зависимые_роли_names перечисляет все роли, которые включены, потому что они являются зависимостью другой роли. Это означает, что они могут включать роли, которые также определены в play_role_names, поэтому проверка на play_role_names может проверить, является ли конкретная роль только зависимостью или и зависимостью, и явно необходимой.

Этот коммит был добавлен в разработку в ноябре 2018 г., версия 2.4 вышла в сентябре 2018 г.

Второй вариант

Более простой способ убедиться, что в конкретной версии есть переменная, - использовать pip и virtualenv, чтобы вы могли легко переключиться на более старые версии Ansible и посмотреть с помощью ansible all -m setup. Видеть https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html#latest-releases-via-pip

Третий вариант

Взгляните на журналы изменений! У каждой основной версии Ansible есть свой журнал изменений, и местоположение менялось с годами, но давайте возьмем Версия 2.8 В примечаниях к выпуску 2.8.0:

  • магические переменные - добавлена ​​новая магическая переменная ansible_dependent_role_names, которая содержит имена ролей, применяемых к хосту косвенно, через зависимости.
  • магические переменные - добавлена ​​новая магическая переменная ansible_play_role_names, чтобы имитировать старую функциональность role_names. Эта переменная перечисляет только имена ролей, применяемых напрямую к хосту, и не включает те, которые добавлены через зависимости.
  • магические переменные - добавлена ​​новая магическая переменная ansible_role_names для включения имен ролей, применяемых к хосту как прямо, так и косвенно (через зависимости).