Я могу применить 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 для включения имен ролей, применяемых к хосту как прямо, так и косвенно (через зависимости).