Escaping double curly braces in Ansible

前端 未结 10 1061
我寻月下人不归
我寻月下人不归 2020-12-13 05:19

How to escape double curly braces in Ansible 1.9.2?

For instance, how can I escape double curly braces in the following shell command?

- name: Test 
         


        
相关标签:
10条回答
  • 2020-12-13 06:13

    Tried on with ansible 2.1.1.0

    {%raw%}...{%endraw%} block seems the clear way

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

    Only need to escape leading '{{'

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

    No harm to escap the tailing '}}', except more difficult to read.

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

    Backslash '\' seems do not work

    0 讨论(0)
  • 2020-12-13 06:13

    I was unable to get @Ben's answer to work (shell: !unsafe ...)

    What follows here is a complete (and working!) answer to the OP's question, updated for Ansible >2.0

    ---
    # file: play.yml
    
    - hosts: localhost
      connection: local
      gather_facts: no
      vars:
        # regarding !unsafe, please see:
        # https://docs.ansible.com/ansible/latest/user_guide/playbooks_advanced_syntax.html
        #
        - NetworkSettings_IPAddress: !unsafe "{{.NetworkSettings.IPAddress}}"
      tasks:
        - shell: "docker inspect --format '{{NetworkSettings_IPAddress}}' instance1"
          register: out
        - debug: var="{{item}}"                                                                                                   
          with_items:                                                                                                             
            - out.cmd                                                                                                             
            - out.stdout                                                                                                          
    

    outputs: ([WARNINGS] removed)

    # ansible-playbook play.yml
    PLAY [localhost] ***************************************************************
    
    TASK [shell] *******************************************************************
    changed: [localhost]
    
    TASK [debug] *******************************************************************
    ok: [localhost] => (item=out.cmd) => {
        "item": "out.cmd", 
        "out.cmd": "docker inspect --format '{{.NetworkSettings.IPAddress}}' instance1"
    }
    ok: [localhost] => (item=out.stdout) => {
        "item": "out.stdout", 
        "out.stdout": "172.17.0.2"
    }
    
    PLAY RECAP *********************************************************************
    localhost                  : ok=2    changed=1    unreachable=0    failed=0   
    

    # ansible --version | head -1
    ansible 2.6.1
    
    0 讨论(0)
  • 2020-12-13 06:17

    Here is a mostly clean and Ansible native workaround not depending on docker --inspect with curly braces. We assume we have just referenced one container with the Ansible docker module before:

    - 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','') }}"
    

    You now have the IP of the Docker container in the Variable _container_ip. I also published this workaround on my article The Marriage of Ansible with Docker.

    [Update 2015-11-03] Removed whitespaces of the stdout of the container query.

    [Update 2015-11-04] BTW, there were two pull requests in the official Ansible repository, that would made this workaround needless by recovering the facts returned by the Docker module. So you could acces the IP of a docker container via docker_containers[0].NetworkSettings.IPAddress. So please vote for those pull requests:

    • fixed broken facts #1457
    • docker module: fix regressions introduced by f38186c and 80aca4b #2093
    0 讨论(0)
  • 2020-12-13 06:20

    New in Ansible 2.0 is the ability to declare a value as unsafe with the !unsafe tag.

    In your example you could do:

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

    See the docs for details.

    0 讨论(0)
提交回复
热议问题