Ansible 模板在破折号后跳过字符串

标签 ansible jinja2

我正在用 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/

相关文章:

ruby-on-rails - Vagrant+Ansible+Redis - 使用不同服务器时获取 127.0.0.1:6379 (Errno::ECONNREFUSED)

ansible - 使用 Ansible 有条件地向命令模块添加其他参数

python - 如何在 CentOS8 上安装 Ansible

ansible - ssl : auth method ssl requires a password

python-2.7 - Jinja2 无法再找到模板 TemplateNotFound

python - 如何在 bottle 中使用 jinja2 i18n(带 babel)

javascript - 如何将字典从 Jinja2(使用 Python)传递给 Javascript?

ansible - ansible with_together 中的复杂循环

python - Flask 模板中点符号和方括号之间的区别

javascript - 如何在 Jinja2 中插入仪表 JavaScript 插件并设置/更新其参数?