web-dev-qa-db-ja.com

Ansibleで二重中括弧をエスケープする

Ansible 1.9.2で二重中括弧をエスケープする方法は?

たとえば、次のシェルコマンドで二重中括弧をエスケープするにはどうすればよいですか?

- name: Test 
  Shell: "docker inspect --format '{{ .NetworkSettings.IPAddress }}' instance1"
51
Davide Guerri

Ansibleで競合する文字に問題があるときはいつでも、経験則はそれらをJinja式の文字列として出力することです。

したがって、{{の代わりに{{ '{{' }}を使用します。

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

Jinja2ドキュメントのトピック「エスケープ」

80
udondan

この:

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

動作するはずです

別の方法は、\{\{ .NetworkSettings.IPAddress \}\}のようなバックスラッシュを使用することです

それが役に立てば幸い

36
Filipe

Ansible 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{{'}}'}}"

バックスラッシュ「\」は機能しないようです

19
Tiger peng

Ansible 2.0の新機能は、値を安全でない型として指定する機能です。

あなたの例では次のことができます:

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

ドキュメントを参照 詳細については。

5
Ben

私には同様の問題があります:いくつかのgoテンプレート変数を含むjinja2テンプレートから作成されたJSONドキュメントを投稿する必要があります(はい、私は知っています:-P)

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

間のテンプレートのこの部分をフェンスしようとしています

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

テンプレートと変数の置換を2回実行するansibleの魔法があるため、機能しませんでした(それについてはわかりませんが、最終的にはこのようになります)

「未定義の変数service_name "テンプレートを使用しようとすると...

だから私は!unsafeおよび{% raw %} ... {% endraw %}後でテンプレートで使用されるファクトを定義します。

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

テンプレートにはこれが含まれます:

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

出力は大丈夫です:

"NAME_TEMPLATE": "%{{service_name}}.%{{stack_name}}.%{{environment_name}}",
3
zuzur

dondan's answer ;の短い代替案を次に示します。文字列全体を二重括弧で囲みます。

Shell: "docker inspect --format {{ '{{ .NetworkSettings.IPAddress }}' }} instance1"
3
bmaupin

私は小さなスクリプトを使用して問題を回避することができました:

#!/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が二重中括弧のエスケープを許可しないことは非常に驚くべきことです!

3
Davide Guerri

私は@Benの仕事に対する答えを得ることができませんでした(Shell: !unsafe ...

以下は、OPの質問に対する完全な(そして機能する!)回答であり、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                                                                                                          

出力:([警告]削除)

# 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
1
Marc Tamsky