Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ansible模板尝试在未使用的条件分支中计算变量:这是正常行为吗?_Ansible_Ansible 2.x_Ansible Template - Fatal编程技术网

Ansible模板尝试在未使用的条件分支中计算变量:这是正常行为吗?

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

我正在使用Ansible 2.8.6,在使用条件时,我遇到了模板错误。它试图计算变量的某些部分,即使这些变量仅用于模板的“未使用的分支”。在我的例子中,计算这些变量没有意义,并且会引发错误,所以我不希望Ansible计算这些变量。我希望Ansible/Jinja2在使用它们的条件未满足时不会计算它们

我试图解释的简单示例:

  • 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