Wie entkomme ich doppelten geschweiften Klammern in Ansible 1.9.2?
Wie kann ich beispielsweise im folgenden Shell-Befehl doppelte geschweifte Klammern umgehen?
- name: Test
shell: "docker inspect --format '{{ .NetworkSettings.IPAddress }}' instance1"
inspect
Docker-Client-Befehl eine go-Vorlage eingibt, die die doppelten geschweiften Klammern als jinja2 verwendet. Ich brauche einen Weg, um die geschweiften Klammern zum letzten Befehl zu bringen, den Ansile auf den Zielservern ausführt. Siehe docs.docker.com/reference/commandline/inspect -Antworten:
Wenn Sie Probleme mit widersprüchlichen Zeichen in Ansible haben, gilt als Faustregel, diese als Zeichenfolge in einem Jinja-Ausdruck auszugeben.
Also anstatt
{{
du würdest verwenden{{ '{{' }}
:Thema "Escaping" in den Jinja2-Dokumenten.
quelle
changed: [docker-server.local] => {"changed": true, "cmd": "docker inspect --format '{# .NetworkSettings.IPAddress #}' glance-api.os-in-a-box", "delta": "0:00:00.029344", "end": "2015-08-29 17:36:37.962143", "rc": 0, "start": "2015-08-29 17:36:37.932799", "stderr": "", "stdout": "172.17.1.6", "warnings": []}
raw_var: '{{ '{{' }}something{{ '}}' }}'
und an anderer Stelle referenzieren, erhaltencommand: "{{ raw_var }}"
SieError: something is undefined
.raw_var: "{{ '{{' }}something{{ '}}' }}"
?Dies:
Sollte arbeiten
Eine andere Möglichkeit ist die Verwendung von Backslashes wie
\{\{ .NetworkSettings.IPAddress \}\}
Ich hoffe es hilft
quelle
{ raw }...{% endraw %}
arbeite für mich. Flucht funktioniert allerdings nicht. Es wird in\\{\\{ .NetworkSettings.IPAddress \\}\\}
fatal: [docker-server.local] => Failed to template {{test}}: Failed to template docker inspect --format '{{ .NetworkSettings.IPAddress }}' glance-api.os-in-a-box: template error while templating string: unexpected '.'
- name: Find ipv6 of of some-host shell: docker inspect -f "{% raw %} {{ .NetworkSettings.GlobalIPv6Address }} {% endraw %}" {{some.host}} > tmp.txt - command: cat tmp.txt register: result - debug: msg="{{ result.stdout }}"
Versucht mit ansible 2.1.1.0
Der Block {% raw%} ... {% endraw%} scheint der klare Weg zu sein
Muss nur dem führenden '{{' entkommen
Kein Schaden, dem Tailing '}}' zu entkommen, außer schwieriger zu lesen.
Backslash '\' scheint nicht zu funktionieren
quelle
Neu in Ansible 2.0 ist die Möglichkeit, einen Wert mit dem
!unsafe
Tag als unsicher zu deklarieren .In Ihrem Beispiel könnten Sie Folgendes tun:
Einzelheiten finden Sie in den Dokumenten .
quelle
!unsafe 'docker inspect --format "{{ .NetworkSettings.IPAddress }}" instance1'
Ich habe ein ähnliches Problem: Ich muss ein JSON-Dokument veröffentlichen, das aus einer jinja2-Vorlage erstellt wurde, die einige Variablen für go-Vorlagen enthält (ja, ich weiß :-P), z
"NAME_TEMPLATE": %{{service_name}}.%{{stack_name}}.%{{environment_name}}
Der Versuch, diesen Teil der Vorlage zwischenzäunen
{% raw %} ... {% endraw %}
hat nicht funktioniert, weil es in ansible eine Art Magie gibt, die die Vorlage und die variable Substitution zweimal ausführt (da bin ich mir nicht sicher, aber es sieht definitiv so aus).
Sie erhalten "undefinierte Variable
service_name
", wenn Sie versuchen, die Vorlage zu verwenden ...Also habe ich eine Kombination aus
!unsafe
und verwendet{% raw %} ... {% endraw %}
, um eine Tatsache zu definieren, die später in der Vorlage verwendet wird.Die Vorlage enthält Folgendes:
und die Ausgabe ist in Ordnung:
quelle
Hier ist eine kürzere Alternative zu Udondans Antwort . Umgeben Sie die gesamte Zeichenfolge mit doppelten Klammern:
quelle
Ich habe es geschafft, mein Problem mit einem kleinen Skript zu umgehen:
Und das folgende Ansible-Spiel
Trotzdem ist es sehr überraschend, dass Ansible es nicht zulässt, doppelten geschweiften Klammern zu entkommen!
quelle
Die Lösung mit
raw
wurde bereits erwähnt, aber der Befehl in der Antwort zuvor hat bei mir leider nicht funktioniert.Ohne Ansible:
Mit ansible:
quelle
Ich konnte @ Bens Antwort nicht zur Arbeit bringen (
shell: !unsafe ...
)Was hier folgt, ist eine vollständige (und funktionierende!) Antwort auf die Frage des OP, die für Ansible> 2.0 aktualisiert wurde
Ausgänge: ([WARNHINWEISE] entfernt)
quelle
Hier ist eine meist saubere und Ansible native Problemumgehung, die nicht von
docker --inspect
geschweiften Klammern abhängt. Wir gehen davon aus, dass wir zuvor nur einen Container mit dem Docker-Modul Ansible referenziert haben :Sie haben jetzt die IP des Docker-Containers in der Variablen
_container_ip
. Ich habe diese Problemumgehung auch in meinem Artikel Die Ehe von Ansible mit Docker veröffentlicht .[Update 03.11.2015] Leerzeichen aus dem Standard der Containerabfrage entfernt.
[Update 2015-11-04] Übrigens gab es im offiziellen Ansible-Repository zwei Pull-Anforderungen, die diese Problemumgehung unnötig machten, indem die vom Docker-Modul zurückgegebenen Fakten wiederhergestellt wurden. So können Sie über auf die IP eines Docker-Containers zugreifen
docker_containers[0].NetworkSettings.IPAddress
. Bitte stimmen Sie für diese Pull-Anfragen ab:quelle