我正在用 Ansible 中的一组变量模板化一个文件。
我的 defaults/main.yaml
文件中的一些条目是:
jenkins_plugins:
'ant': '1.8'
'antisamy-markup-formatter': '1.5'
'apache-httpcomponents-client-4-api': '4.5.3-2.1'
'kubernetes': '1.3'
这个键值对中的一个应该被注入(inject)到我的模板文件 config.xml.j2
的这一行中:
<markupFormatter class="hudson.markup.RawHtmlMarkupFormatter" plugin="antisamy-markup-formatter@{{ jenkins_plugins.antisamy-markup-formatter }}">
所以基本上我的最终结果应该是这样的:
<markupFormatter class="hudson.markup.RawHtmlMarkupFormatter" plugin="antisamy-markup-formatter@1.5">
但是当我运行调用这个模板文件的剧本时,我得到了错误:
TASK [jenkins : Generate config.xml file.] ****************************************
fatal: [default]: FAILED! => {"changed": false, "msg": "AnsibleUndefinedVariable: 'dict object' has no attribute 'antisamy'"}
如果我删除所有破折号 -
,它会工作正常,但这是我不能做的事情,因为我还必须下载这些插件,我需要用破折号 curl 正确的名称。
为什么 jinja 模板会跳过 -
之后的所有内容?
最佳答案
Python 不喜欢在属性名称中使用破折号 -
,但您可以使用映射语法:
{{ jenkins_plugins["antisamy-markup-formatter"] }}
如果您有包含破折号的变量名称,您可以使用 vars
:
{{ vars["jenkins-plugins"] }}
但是,请注意,如果您尝试定义包含破折号的变量,ansible 将抛出一个错误,指出变量名称不能包含破折号。这仅在使用“默认值”时有效 - 但我猜这是一个错误。
关于Ansible 模板在破折号后跳过字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52396669/