在Ansible中逃避双花括号

如何摆脱Ansible 1.9.2双花括号?

例如,如何在下面的shell命令中转义双花括号?

- name: Test shell: "docker inspect --format '{{ .NetworkSettings.IPAddress }}' instance1" 

这里是一个大多干净和Ansible本机解决scheme不依赖于docker --inspect花括号。 我们假设我们刚刚在Ansible docker模块中引用了一个容器:

 - name: query IP of client container shell: "docker exec {{ docker_containers[0].Id }} hostname -I" register: _container_query - name: get IP of query result set_fact: _container_ip: "{{ _container_query.stdout | regex_replace('\\s','') }}" 

您现在拥有variables_container_ip中的Docker容器的IP。 我还在我的文章“Docker与Ansible的结合”中发表了这个解决方法。

[Update 2015-11-03]删除了容器查询的stdout的空格。

[更新2015-11-04]顺便说一下,在Ansible官方仓库中有两个pull请求,这将通过恢复Docker模块返回的事实来解决这个问题。 所以你可以通过docker_containers[0].NetworkSettings.IPAddress一个docker_containers[0].NetworkSettings.IPAddress容器的IP地址。 所以请为这些拉取请求投票:

  • 修复了破损的事实#1457
  • docker模块:修复由f38186c和80aca4b#2093引入的回归

只要你在Ansible中有冲突的字符时遇到问题,一个经验法则就是把它们作为Jinjaexpression式中的string输出。

所以,而不是{{你会使用{{ '{{' }}

 - debug: msg="docker inspect --format '{{ '{{' }} .NetworkSettings.IPAddress {{ '}}' }}' instance1" 

Jinja2文档中的主题“转义”

这个:

 - name: Test shell: "docker inspect --format {% raw %}'{{ .NetworkSettings.IPAddress }}' {% endraw %} instance1" 

应该pipe用

另一种方法是使用反斜杠,如\{\{ .NetworkSettings.IPAddress \}\}

希望能帮助到你

尝试使用2.1.1.0

{%raw%} … {%endraw%}块似乎是一种清晰的方式

 - name: list container images and name date on the server shell: docker ps --format {%raw%}"{{.Image}} {{.Names}}"{%endraw%} 

只需要逃离领先的'{{

 tasks: - name: list container images and names shell: docker ps --format "{{'{{'}}.Image}} {{'{{'}}.Names}}" 

除了更难以阅读外,没有伤害拖尾的“}}”。

 tasks: - name: list container images and names shell: docker ps --format "{{'{{'}}.Image{{'}}'}} {{'{{'}}.Names{{'}}'}}" 

反斜杠“\”似乎不起作用

我设法解决我的问题使用一个小脚本:

 #!/usr/bin/env bash docker inspect --format '{{ .NetworkSettings.IPAddress }}' "$1" 

和下面的Ansible玩

 - copy: src: files/get_docker_ip.sh dest: /usr/local/bin/get_docker_ip.sh owner: root group: root mode: 0770 - shell: "/usr/local/bin/get_docker_ip.sh {{ SWIFT_ACCOUNT_HOSTNAME }}" register: swift_account_info 

然而,Ansible不允许逃避双重大括号是非常令人惊讶的!

Ansible 2.0中的新function是将值指定为不安全types。

在你的例子中,你可以这样做:

 - name: Test shell: !unsafe "docker inspect --format '{{ .NetworkSettings.IPAddress }}' instance1" 

有关详细信息, 请参阅文档 。