【问题标题】:Using {{ and }} in ansible shell command在 ansible shell 命令中使用 {{ 和 }}
【发布时间】:2017-01-19 09:10:55
【问题描述】:

我的剧本中有这个:

- name: Get facts about containers
  shell: "docker ps -f name=jenkins --format {%raw%}{{.Names}}{% endraw %}"
  register: container

注意,我插入了{%raw%}{%endraw%},这样ansible 就不会评估'{{'。

如果我运行这个,我会得到这个错误:

致命:[本地主机]:失败! => {"failed": true, "msg": "{u'cmd': u'docker ps -f name=jenkins --format {{.Names}}', u'end': u'2017-01 -19 10:04:27.491648', u'stdout': u'ecs-sde-abn-17-jenkins-ec8eccee8c9eb8e38f01', u'changed': True, u'start': u'2017-01-19 10: 04:27.481090', u'delta': u'0:00:00.010558', u'stderr': u'', u'rc': 0, 'stdout_lines': [u'ecs-task-17-jenkins- ec8eccee8c9eb8e38f01'], u'warnings': []}: template error while templating string: unexpected '.'. String: docker ps -f name=jenkins --format {{.Names}}"}

换句话说,命令运行成功(输出 ecs-task-17-jenkins-ec8eccee8c9eb8e38f01 是正确的),但它再次尝试模板字符串...?

这里出了什么问题,我该如何解决?

已编辑

像这样转义{{

shell: "docker ps -f name=jenkins --format {{ '{' }}{.Names}{{ '}' }}"

导致同样的错误。

【问题讨论】:

标签: ansible jinja2


【解决方案1】:

这是 Ansible 2.2.1 中引入的一个问题:https://github.com/ansible/ansible/issues/20400。 在使用 {{ 内部注册变量时发生。

This 解决方法防止{{ 出现在注册变量中:

shell: "docker inspect --format '{''{ .NetworkSettings.IPAddress }''}' consul"

重现错误的方法:

- hosts: localhost
  gather_facts: no
  tasks:
    - shell: "echo '{''{.Names}''}'"
      register: myvar    
    - debug: var=myvar

【讨论】:

  • @techraf 在答案中添加了代码示例。直到您触摸myvar 一切正常(注释掉debug),当您尝试使用myvar 时,它会失败。
  • @techraf 是的,因为它回显了{{.Names}},它在结果的stdout 键中弹出(将回显重定向到文件,一切都会好起来的)。对于 OP 任务,我的解决方法有效,因为没有带双括号的输出,而 cmd 键具有防止注册变量中出现双括号的技巧。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-25
  • 1970-01-01
相关资源
最近更新 更多