Ansible模板尝试在未使用的条件分支中计算变量:这是正常行为吗?
我正在使用Ansible 2.8.6,在使用条件时,我遇到了模板错误。它试图计算变量的某些部分,即使这些变量仅用于模板的“未使用的分支”。在我的例子中,计算这些变量没有意义,并且会引发错误,所以我不希望Ansible计算这些变量。我希望Ansible/Jinja2在使用它们的条件未满足时不会计算它们 我试图解释的简单示例:Ansible模板尝试在未使用的条件分支中计算变量:这是正常行为吗?,ansible,ansible-2.x,ansible-template,Ansible,Ansible 2.x,Ansible Template,我正在使用Ansible 2.8.6,在使用条件时,我遇到了模板错误。它试图计算变量的某些部分,即使这些变量仅用于模板的“未使用的分支”。在我的例子中,计算这些变量没有意义,并且会引发错误,所以我不希望Ansible计算这些变量。我希望Ansible/Jinja2在使用它们的条件未满足时不会计算它们 我试图解释的简单示例: pb_test.yml(剧本) 模板/test.txt.j2(模板) inventory/hosts localhost inventory/group\u var
(剧本)pb_test.yml
(模板)模板/test.txt.j2
inventory/hosts
localhost
inventory/group\u vars/all.yml
use_last_name: True names: [] ## I don't have any names in the list but it does not matter, I use last names. first_name: "{{ names | first }}" last_name: "Doe"
first\u name
,但这没关系,因为我不使用它。但我有以下结果:
$ ansible-playbook -i inventory/host -kK -u admin pb_test.yml
SSH password:
BECOME password[defaults to SSH password]:
PLAY [Testing template] ************************************************************************************************************************************
TASK [Gathering Facts] ****************************************************************************************************************************************
ok: [localhost]
TASK [Generate a file from a template] ******************************************************************************************************************************************
fatal: [localhost]: FAILED! => {"changed": false, "msg": "AnsibleUndefinedVariable: No first item, sequence was empty."}
PLAY RECAP ****************************************************************************************************************************************************
localhost : ok=1 changed=0 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0
从错误中,我了解到Ansible正在尝试计算first_name
,即使它不会被使用。请注意,如果根本没有定义first_name
和names
,脚本运行良好:据我所知,问题来自Ansible试图计算的|first
过滤器
这是正常的行为吗?如果是,有人能解释一下为什么会发生这种情况(为什么要尝试计算一个未使用的变量/过滤器?)。有没有一种解决方法可以让它像我期望的那样工作?长话短说让你开始=>或者定义
名字:{{{names}first}默认('''}}}}}}
或者放弃这个定义,直接使用“{names}first}”。我的朋友就是这样称呼我的。
在你的模板中。我基本上知道原因(ansible/jinja2“parseception”…),但我手头没有所有的参考资料,也没有足够的时间给出令人满意的解释。jinja2版本2.8.7是的,我感觉这与ansible和jinja2如何交互和解析变量有关。我选择了有效的default()
解决方案。但我会保持开放,因为我对解释(或给出提示)“幕后部分”的解决方案感兴趣。长话短说让你继续=>要么定义first\u name:“{{names | first | default('')}}”
要么放弃该定义,直接使用“{names | first}}”。我的朋友就是这样称呼我的。
在你的模板中。我基本上知道原因(ansible/jinja2“parseception”…),但我手头没有所有的参考资料,也没有足够的时间给出令人满意的解释。jinja2版本2.8.7是的,我感觉这与ansible和jinja2如何交互和解析变量有关。我选择了有效的default()
解决方案。但我会保持开放,因为我对解释(或给出提示)“幕后部分”的解决方案感兴趣。
use_last_name: True
names: [] ## I don't have any names in the list but it does not matter, I use last names.
first_name: "{{ names | first }}"
last_name: "Doe"
$ ansible-playbook -i inventory/host -kK -u admin pb_test.yml
SSH password:
BECOME password[defaults to SSH password]:
PLAY [Testing template] ************************************************************************************************************************************
TASK [Gathering Facts] ****************************************************************************************************************************************
ok: [localhost]
TASK [Generate a file from a template] ******************************************************************************************************************************************
fatal: [localhost]: FAILED! => {"changed": false, "msg": "AnsibleUndefinedVariable: No first item, sequence was empty."}
PLAY RECAP ****************************************************************************************************************************************************
localhost : ok=1 changed=0 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0