在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"
有关详细信息, 请参阅文档 。