Я работал с Ansible (версия 2.8.5) в течение нескольких недель и видел некоторые противоречивые действия с include, поэтому я перехожу к использованию include_tasks (так как я также заметил, что это устарело ... ).
Может кто-нибудь объяснить это поведение? У меня проблемы с пониманием, как работают переменные. Прежде всего, я понимаю, что неправильно использовать имена переменных, но я просто сделал простой тест, чтобы попытаться понять.
Вот моя книга игр:
---
- hosts: all
gather_facts: false
roles:
- app_include_tasks_test
Это app_include_tasks_test роль (tasks / main.yml):
---
- name: Setting abc to Computer
set_fact:
abc: Computer
- name: Running more tasks...
include_tasks: ../../../library/test_include.yml
vars:
abc: iPhone
- name: I expect abc to be Android and random_var to be BlackBerry but...
debug:
msg: Value of abc is {{ abc }}, {{ random_var }}
Вот содержимое test_include.yml ...
---
- name: I expect this to be iPhone
debug:
msg: Value of {{ abc }} inside of included tasks
- name: I expect this to change abc to Android
set_fact:
abc: Android
- name: I expect this to be Android now..
debug:
msg: Value of {{ abc }} after value was set inside include
- name: I expect this to globally set random_var to BlackBerry
set_fact:
random_var: BlackBerry
Это то, что я запускаю:
ansible-playbook test_include_play.yml -i inventory-file.yml -l testhost
Это вывод ...
TASK [app_include_tasks_test : Setting abc to Computer] ******************************************************************************
ok: [testhost] => {"ansible_facts": {"abc": "Computer"}, "changed": false}
TASK [app_include_tasks_test : Running more tasks...] ********************************************************************************
included: /etc/ansible/roles/app_include_tasks_test/tasks/../../../library/test_include.yml for testhost
TASK [app_include_tasks_test : I expect this to be iPhone] ***************************************************************************
ok: [testhost] => {
"msg": "Value of iPhone inside of included tasks"
}
TASK [app_include_tasks_test : I expect this to change abc to Android] ***************************************************************
ok: [testhost] => {"ansible_facts": {"abc": "Android"}, "changed": false}
TASK [app_include_tasks_test : I expect this to be Android now..] ********************************************************************
ok: [testhost] => {
"msg": "Value of iPhone after value was set inside include"
}
TASK [app_include_tasks_test : I expect this to globally set random_var to BlackBerry] ***********************************************
ok: [testhost] => {"ansible_facts": {"random_var": "BlackBerry"}, "changed": false}
TASK [app_include_tasks_test : I expect abc to be Android and random_var to be BlackBerry but...] ************************************
ok: [testhost] => {
"msg": "Value of abc is Android, BlackBerry"
}
Так что, как я видел, Ansible работает, я полностью ожидаю, что set_fact внутри test_include повлияет на значения глобально.
Я не ожидал, что когда ab c установлен в Android внутри test_include, что во время действия test_include это все равно будет iPhone, и был действительно удивлен, что впоследствии он был установлен в Android?
Возможно, я отвечаю на свой вопрос здесь, но означает ли это, что переменные: используемые с import_tasks находятся в другой области действия внутри задач import_tasks, и когда я использую set_fact внутри, это фактически меняет переменную, которая назван так же, но в другом арендная плата (та же, что и в роли).
Я все равно задам вопрос, если это кому-нибудь поможет, и если я ошибаюсь, я счастлив, что меня исправят!