Как избежать двойных фигурных скобок в Ansible 1.9.2?
Например, как я могу избежать двойных фигурных скобок в следующей команде оболочки?
- name: Test
shell: "docker inspect --format '{{ .NetworkSettings.IPAddress }}' instance1"
Как избежать двойных фигурных скобок в Ansible 1.9.2?
Например, как я могу избежать двойных фигурных скобок в следующей команде оболочки?
- name: Test
shell: "docker inspect --format '{{ .NetworkSettings.IPAddress }}' instance1"
Вот в основном чистый и 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
. Поэтому, пожалуйста, проголосуйте за те запросы:
Всякий раз, когда у вас возникают проблемы с конфликтующими символами в Ansible, эмпирическое правило заключается в том, чтобы выводить их как строку в выражении Jinja.
Итак, вместо {{
вы использовали бы {{ '{{' }}
:
- debug: msg="docker inspect --format '{{ '{{' }} .NetworkSettings.IPAddress {{ '}}' }}' instance1"
Это:
- name: Test
shell: "docker inspect --format {% raw %}'{{ .NetworkSettings.IPAddress }}' {% endraw %} instance1"
Должен работать
Другой способ сделать это - использовать обратную косую черту, например \{\{ .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{{'}}'}}"
Обратное сальто '\' похоже не работает
Мне удалось обойти мою проблему, используя небольшой 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 не позволяет избежать двойных фигурных скобок!
Новое в Ansible 2.0 - это возможность указать значение как небезопасное.
В вашем примере вы можете сделать:
- name: Test
shell: !unsafe "docker inspect --format '{{ .NetworkSettings.IPAddress }}' instance1"