Подтвердить что ты не робот

Скрытие двойных фигурных скобок в Ansible

Как избежать двойных фигурных скобок в Ansible 1.9.2?

Например, как я могу избежать двойных фигурных скобок в следующей команде оболочки?

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

Ответ 1

Вот в основном чистый и Ansible native обходной путь, не зависящий от docker --inspect с фигурными фигурными скобками. Предположим, мы только что указали один контейнер с модулем докинга Ansible до:

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

Теперь у вас есть IP-адрес контейнера Docker в переменной _container_ip. Я также опубликовал это обходное решение в своей статье "Женитьбу с несанкционированным докером" .

[Обновить 2015-11-03] Удалены пробелы в стандартном дескрипторе запроса контейнера.

[Update 2015-11-04] Кстати, в официальном репозитории Ansible было два запроса на загрузку, что сделало бы это обходным путем ненужным, восстановив факты, возвращаемые модулем Docker. Таким образом, вы можете получить IP-адрес контейнера докера через docker_containers[0].NetworkSettings.IPAddress. Поэтому, пожалуйста, проголосуйте за те запросы:

Ответ 2

Всякий раз, когда у вас возникают проблемы с конфликтующими символами в Ansible, эмпирическое правило заключается в том, чтобы выводить их как строку в выражении Jinja.

Итак, вместо {{ вы использовали бы {{ '{{' }}:

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

Тема "Escaping" в документах Jinja2.

Ответ 3

Это:

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

Должен работать

Другой способ сделать это - использовать обратную косую черту, например \{\{ .NetworkSettings.IPAddress \}\}

Надеюсь, что это поможет

Ответ 4

Пробовал с доступным 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{{'}}'}}"

Обратное сальто '\' похоже не работает

Ответ 5

Мне удалось обойти мою проблему, используя небольшой script:

#!/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 не позволяет избежать двойных фигурных скобок!

Ответ 6

Новое в Ansible 2.0 - это возможность указать значение как небезопасное.

В вашем примере вы можете сделать:

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

Подробнее см. в документах.