在 Ansible 上与 Jinja2 的 if 表达式(内联 if-else)中的串联不起作用
Concatenation not working in if expression (inline if-else) with Jinja2 on Ansible
所以,我正在尝试在 Jinja 中创建一种多变的东西,因为这个
{{ var1.x | var2.x | default('', true) }}
不起作用,因为 var2 不是过滤器...
我正在使用像这样的 inline 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) }}
有效...为什么?我怎样才能实现我想要做的事情?
事实证明,这个问题很容易解决...
我不认为你可以像在几乎所有编程语言中那样在 Jinja 中链接内联 if 表达式...
我的问题已解决:
{{ var1.x ~ '-' if var1.x is defined else var2.x ~ '-' if var2.x is defined | default('', true) }}
感谢@Rivers 让我在别处寻找错误,这实际上让我意识到错误消息是正确的,我只是在犯傻
所以,我正在尝试在 Jinja 中创建一种多变的东西,因为这个
{{ var1.x | var2.x | default('', true) }}
不起作用,因为 var2 不是过滤器...
我正在使用像这样的 inline 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) }}
有效...为什么?我怎样才能实现我想要做的事情?
事实证明,这个问题很容易解决...
我不认为你可以像在几乎所有编程语言中那样在 Jinja 中链接内联 if 表达式...
我的问题已解决:
{{ var1.x ~ '-' if var1.x is defined else var2.x ~ '-' if var2.x is defined | default('', true) }}
感谢@Rivers 让我在别处寻找错误,这实际上让我意识到错误消息是正确的,我只是在犯傻