2016-05-25 4 views
5

Ich muss Einzel- und doppelte Anführungszeichen in einem ansible Playbook ordnungsgemäß entkommen, um die Umgebungsvariable festzulegen. Keines dieser Werke:Wie doppelten und einfachen Anführungszeichen in YAML innerhalb der gleichen Zeichenfolge zu entkommen

- name: Set environment variable 
    command: > 
     export EXTRA_CONFIG=“'”{"client": {"subscriptions": ["DIND-Worker"], "cluster": "internal"}}“'” 

    - name: Set environment variable 
    command: > 
     export EXTRA_CONFIG=''{"client": {"subscriptions": ["DIND-Worker"], "cluster": "internal"}}'' 

    - name: Set environment variable 
    command: > 
     export EXTRA_CONFIG=''{\"client\": {\"subscriptions\": [\"DIND-Worker\"], \"cluster\": \"internal\"}}'' 

auf diese Sah:

http://yaml.org/spec/current.html#id2532720

https://github.com/dotmaster/toYaml/issues/1

Die Fehlermeldung ich erhalte, ist:

fatal: [ip.address]: FAILED! => {"changed": false, "cmd": "export 'EXTRA_CONFIG={\"client\":' '{\"subscriptions\":' '[\"DIND-Worker\"],' '\"cluster\":' '\"internal\"}}'", "failed": true, "msg": "[Errno 2] No such file or directory", "rc": 2} 
+0

Können Sie versuchen, die 'Shell' anstelle des' Befehls' Moduls zu verwenden? Sie können dann einfach durch '\" 'entkommen. Wenn Sie nur die env vars auf einer Taskbasis benötigen, können Sie auch' shell' '' environment' 'Feature verwenden wie beschrieben [hier] (http://stackoverflow.com)/questions/31775099/how-to-set-environmental-variables-using-ansible) – fishi

Antwort

5

> einen Block Skalar beginnt, in dem du nicht e scape irgendetwas (und es gibt keine Escape-Sequenzen verarbeitet). Also vorausgesetzt, Sie einfache Anführungszeichen um Ihre JSON-ähnlichen Wert wünschen, gerade tun:

- name: Set environment variable 
    command: > 
     export EXTRA_CONFIG='{"client": {"subscriptions": ["DIND-Worker"], "cluster": "internal"}}' 

Edit: Beachten Sie auch, dass ein gefalteter Skalar standardmäßig ein Newline-Zeichen enthält. Wenn Sie das nicht möchten, verwenden Sie einfach >- anstelle von >.

+0

Funktioniert das wirklich für dich? In meinem Fall würde ich immer noch "[Errno 2] Keine solche Datei oder Verzeichnis" bekommen 'möglich durch das' command' Modul? – fishi

+1

Nun, ich antwortete dies basierend auf meinem Wissen über YAML; ich weiß nicht, ansible. Aber ich würde vermuten, dass der Befehl in einer isolierten Shell-Instanz ausgeführt wird, so etwas hier nicht zu beeinflussen Wenn Sie eine globale Umgebungsvariable setzen möchten, müssen Sie sie in '/ etc/environment' oder etwas einfügen – flyx

+0

Guter Punkt - Sie haben Recht, jede Aufgabe würde eine neue Shell öffnen, was die env var bedeutet ist nicht über das ganze Spiel hinweg persistent, außer du legst es in eine dedizierte Datei auf dem Knoten, der von der Shell bezogen wird, oder Sie legen ihn explizit für jede Aufgabe fest, z. B. unter Verwendung des 'environment'-Features des' shell'-Moduls von ansible. – fishi

2

Sie verwenden gefaltet Stil Skalare (eingeführt durch >) und nach dem YAML 1.2-Spezifikation kann man nicht entkommen Zeichen:

Gefaltete Skalare:

Der gefaltete Stil durch die bezeichnet wird „>“ Indikator. Es ist ähnlich dem wörtlichen Stil; gefaltete Skalare unterliegen jedoch einer Linienfaltung.

Und der relevante Text würde im wörtlichen Stil Skalare entkommen.

Innerhalb literaler Skalare gelten alle (eingerückten) Zeichen als Inhalt, einschließlich Leerzeichen. Beachten Sie, dass alle Zeilenumbruchzeichen normalisiert sind. Außerdem werden leere Zeilen nicht gefaltet, obwohl die letzten Zeilenumbrüche und die nachfolgenden leeren Zeilen chomped sind.

Aus Ihrem Beispiel ist unklar, was Sie wirklich tun möchten. Sie sollten den Klappstil zugunsten des doppelt zitierten Stils fallen lassen:

Der doppelt zitierte Stil wird durch umgebende "" Indikatoren angegeben. Dies ist der einzige Stil, der beliebige Strings mit "\" escape ausdrücken kann Folgen: Dies geschieht auf Kosten der Zeichen "\" und "".

oder einzelne zitierte Stil:

Die einfachen Anführungszeichen Stil Indikatoren „'“ durch umgebende angegeben wird. Daher müssen solche Zeichen in einem Skalar mit einem einzelnen Anführungszeichen wiederholt werden. Dies ist die einzige Form des Escaping, die in Skalaren mit einem einzelnen Anführungszeichen ausgeführt wird. Insbesondere können die Zeichen "\" und "" frei verwendet werden. Dies beschränkt einzelne Skalarzeichen auf druckbare Zeichen. Außerdem ist es nur möglich, eine lange Zeile mit einem einfachen Anführungszeichen zu unterbrechen, wenn ein Leerzeichen von nicht umgeben ist -Räume.

Also sollten Sie zuerst entscheiden, was die Ausgabe genau sein soll, dann, wenn Sie alle Zeichen mit Backslash entkommen müssen. Wenn Sie das nicht tun, können Sie einfach den gefalteten Stil verwenden, ohne zu entkommen, oder den einfach zitierten Stil, indem Sie den ' oder den doppelt zitierten Stil umgehen, indem Sie " und alle \ entkommen. Wenn Sie \ benötigen, ist die Flucht in den doppelten Anführungsstrich Ihre einzige Option.

+0

Können Sie Ihren Ausdruck klären? 'Wenn Sie brauchen \ escaping double quoted style ist Ihre einzige Option.' Mit einfachen Anführungszeichen, müssen Sie' \ 'nicht entkommen. Warum sind einfache Anführungszeichen keine Option, wenn Sie '\' in eine Zeichenfolge einschließen müssen? –

+0

Wenn Sie '\ 'Escaping benötigen, müssen Sie einen der [Escapezeichen] (http://www.yaml.org/spec/1.2/spec.html#id2776092) einfügen, die einen Backslash benötigen. Sie können diese nicht in einzelne quotierte Strings einfügen. In diesem Zusammenhang ist die Rede von einfachen Anführungsstrichen irrelevant. – Anthon

+0

Ich sehe. Du meinst, wenn man Dinge wie "\ n", "\ t" hinzufügen muss, muss er doppelte Anführungszeichen verwenden. In umgekehrter Reihenfolge hat der umgekehrte Schrägstrich keine spezielle Bedeutung.Es gibt auch keine Escape-Sequenzen wie '\ n',' \ t' und so weiter. –

0

Ich glaube nicht, dass dies etwas mit Flucht zu tun hat. Von :

Das Befehlsmodul übernimmt den Befehlsnamen, gefolgt von einer Liste von durch Leerzeichen getrennten Argumenten. Der angegebene Befehl wird auf allen ausgewählten Knoten ausgeführt. Es wird nicht durch die Shell verarbeitet, sodass Variablen wie $HOME und Operationen wie "<", ">", "|" und "&" nicht funktionieren (verwenden Sie das Modul shell, wenn Sie diese Funktionen benötigen).

Der Befehl, den Sie ausführen möchten, export, ist keine ausführbare Datei; Es ist eine eingebaute Shell. Es macht Sinn, wenn Ansible nicht den Befehl über eine Shell ausführt, dass Shell-Builtins nicht verfügbar sind, ergo "Keine solche Datei oder Verzeichnis".

Wie die Dokumente sagen, könnten Sie shell anstelle von command verwenden, aber ich bin mir nicht sicher, dass dies eine Lösung ist, weil Ansible wahrscheinlich nachfolgende Befehle in der gleichen Shell nicht ausgeführt wird, also alle zuvor eingestellten Umgebungsvariablen abwesend sein. Finden Sie die Antworten auf diese Frage für einige Optionen, die mit größerer Wahrscheinlichkeit funktionieren: How to set linux environment variables with ansible

Verwandte Themen