Escaping double curly braces in Ansible

前端 未结 10 1060
我寻月下人不归
我寻月下人不归 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 05:56

    Whenever you have problems with conflicting characters in Ansible, a rule of thumb is to output them as a string in a Jinja expression.

    So instead of {{ you would use {{ '{{' }}:

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

    Topic "Escaping" in the Jinja2 docs.

    0 讨论(0)
  • 2020-12-13 05:56

    The solution by using raw has been already mentioned but the command in the answer before unfortunately didn't work for me.

    Without ansible:

    docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' docker_instance_name
    

    With ansible:

    - name: Get ip of db container
      shell: "{% raw %}docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' docker_instance_name{% endraw %}"
      register: db_ip_addr
    - debug:
      var: db_ip_addr.stdout
    
    0 讨论(0)
  • 2020-12-13 06:04

    Here's a shorter alternative to udondan's answer; surround the whole string with double brackets:

    shell: "docker inspect --format {{ '{{ .NetworkSettings.IPAddress }}' }} instance1"
    
    0 讨论(0)
  • 2020-12-13 06:05

    This:

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

    Should work

    Another way to do is using backslashes like \{\{ .NetworkSettings.IPAddress \}\}

    Hope it helps

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

    I have a similar issue: i need to post a JSON doc made from a jinja2 template containing some go templates variables (yes, i know :-P), such as

    "NAME_TEMPLATE": %{{service_name}}.%{{stack_name}}.%{{environment_name}}

    Trying to fence this part of the template between

    {% raw %} ... {% endraw %}

    didn't work because there is some sort of magic in ansible which will run the template and variable substition twice (i'm not sure about that, but it definitively looks like this)

    You end up with "undefined variable service_name" when trying to use the template...

    So i ended up using a combination of !unsafe and {% raw %} ... {% endraw %} to define a fact that's later used in the template.

    - set_fact:
       __rancher_init_root_domain: "{{ rancher_root_domain }}"
       #!unsafe: try to trick ansible into not doing substitutions in that string, then use %raw% so the value won't substituted another time
       __rancher_init_name_template: !unsafe "{%raw%}%{{service_name}}.%{{stack_name}}.%{{environment_name}}{%endraw%}"
    
    - name: build a template for a project
      set_fact:
        __rancher_init_template_doc: "{{ lookup('template', 'templates/project_template.json.j2') }}"
    

    the template contains this:

        "ROOT_DOMAIN":"{{__rancher_init_root_domain}}",
        "ROUTE53_ZONE_ID":"",
        "NAME_TEMPLATE":"{{__rancher_init_name_template }}",
        "HEALTH_CHECK":"10000",
    

    and the output is ok:

    "NAME_TEMPLATE": "%{{service_name}}.%{{stack_name}}.%{{environment_name}}",
    
    0 讨论(0)
  • 2020-12-13 06:11

    I managed to work around my issue using a small script:

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

    And the following Ansible play

    - 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
    

    Nevertheless, it's very surprising that Ansible doesn't allow escaping double curly braces!

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