在 Ansible 上使用 Jinja2 的 if 表达式(内联 if-else)中的连接不起作用

Posted

技术标签:

【中文标题】在 Ansible 上使用 Jinja2 的 if 表达式(内联 if-else)中的连接不起作用【英文标题】:Concatenation not working in if expression (inline if-else) with Jinja2 on Ansible 【发布时间】:2021-10-25 15:15:36 【问题描述】:

所以,我正在尝试在 Jinja 中创建一种多替代变量的东西,因为这个

 var1.x | var2.x | default('', true) 

不起作用,因为 var2 不是过滤器...

我正在使用像这样的内联 if 表达式

 var1.x if var1.x is defined else var2.x | default('', true) 

实现这一目标。但是现在我想将一个字符串连接到两个变量而不是默认值,所以我尝试这样做

 var1.x ~ '-' if var1.x is defined else var2.x ~ '-' | default('', true) 

但是由于某种原因不允许在 else 中进行连接,因为 Ansible 会从中输出错误! -vvv 不提供额外信息。

An exception occurred during task execution. To see the full traceback, use -vvv. The error was: ansible.errors.AnsibleUndefinedVariable: 'dict object' has no attribute 'x'
fatal: [default]: FAILED! => "changed": false, "msg": "AnsibleUndefinedVariable: 'dict object' has no attribute 'x'"

但如果我这样做

 var1.x ~ '-' if var1.x is defined else var2.x | default('', true) 

它有效...为什么?我怎样才能实现我想要做的事情?

【问题讨论】:

我测试了 var1 ~ '-' if var1 is defined else var2 ~ '-' | default('', true) ,它工作正常,你的问题一定出在其他地方。 我正在使用 Ansible 填充模板,可能那里有问题?谢谢 已修复,感谢@Rivers 的输入 是的,这在纯 jinja2 中工作,但在 ansible 中没有。很高兴您找到了解决方案! 【参考方案1】:

事实证明,这个问题很容易解决......

我不认为你可以像在几乎所有编程语言中一样在 Jinja 中链接 inline if 表达式...

我的问题通过以下方式解决:

 var1.x ~ '-' if var1.x is defined else var2.x ~ '-' if var2.x is defined | default('', true) 

感谢@Rivers 让我在别处寻找错误,这实际上让我意识到错误消息是正确的,我只是很愚蠢

【讨论】:

以上是关于在 Ansible 上使用 Jinja2 的 if 表达式(内联 if-else)中的连接不起作用的主要内容,如果未能解决你的问题,请参考以下文章

在 Ansible/Jinja2 中设置 var 的 case 语句

自动化运维工具-Ansible Jinja2模板

自动化运维工具Ansible(10)Jinja2模板

009.Ansible模板管理 Jinja2

ansible自动化运维详解ansible中变量的设定使用JINJA2模板的使用以及ansible的加密控制

ansible自动化运维详解ansible中变量的设定使用JINJA2模板的使用以及ansible的加密控制