it-swarm.com.de

Wie kann man doppelte und einfache Anführungszeichen in YAML innerhalb derselben Zeichenfolge schützen?

Ich muss in einfachen und doppelten Anführungszeichen in einem Spielbuch einsehbar machen, um die Umgebungsvariable festzulegen. Nichts davon funktioniert:

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

Sah das an: 

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

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

Die Fehlermeldung, die ich bekomme, lautet:

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}
12
user3081519

> startet einen Block-Skalar, in dem Sie nichts entgehen müssen (und keine Escape-Sequenzen verarbeitet werden). Nehmen wir an, Sie möchten einfache Anführungszeichen um Ihren JSON-ähnlichen Wert setzen:

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

Bearbeiten: Beachten Sie außerdem, dass ein gefalteter Skalar standardmäßig ein abschließendes Zeilenvorschubzeichen enthält. Wenn Sie dies nicht wünschen, verwenden Sie einfach >- anstelle von >.

15
flyx

Sie verwenden Faltstilskalare (eingeführt durch >), und gemäß der YAML 1.2-Spezifikation können Sie keine Zeichenzeichen mit Escapezeichen versehen:

Gefaltete Skalare:

Der gefaltete Stil wird durch die Markierung ">" angezeigt. Es ist dem wörtlichen Stil ähnlich; Gefaltete Skalare unterliegen jedoch einer Linienfaltung. 

Und der relevante Text wird in wörtlichen Stil-Skalaren dargestellt.

In Literal-Skalaren werden alle (eingerückten) Zeichen als Inhalt betrachtet, einschließlich Leerzeichen. Beachten Sie, dass alle Zeilenumbruchzeichen normalisiert werden. Außerdem werden leere Zeilen nicht gefaltet, obwohl letzte Zeilenumbrüche und nachfolgende leere Zeilen gechomped werden. 

An Ihrem Beispiel ist nicht klar, was Sie wirklich tun wollen. Sie sollten wahrscheinlich den Faltstil zugunsten eines doppelten Anführungszeichens ablegen:

Der doppelt zitierte Stil wird durch umgebende "" "- Indikatoren angegeben. Dies ist der einzige Stil, der in der Lage ist, beliebige Zeichenfolgen mithilfe von \"\"- Escape-Sequenzen auszudrücken. Zeichen. 

oder einfach zitierter Stil:

Der einfach zitierte Stil wird durch umgebende "'" - Indikatoren angegeben. Daher müssen solche Zeichen innerhalb eines Skalars mit einfachen Anführungszeichen wiederholt werden. Dies ist die einzige Form der Flucht, die in Skalaren mit einfachen Anführungszeichen ausgeführt wird. Insbesondere können die Zeichen "\" und "" "frei verwendet werden. Dies beschränkt Skalare in Anführungszeichen auf druckbare Zeichen. Darüber hinaus ist es nur möglich, eine Zeile mit einfachen Anführungszeichen zu durchbrechen, in der ein Leerzeichen von einem Leerzeichen umgeben ist -räume.

Sie sollten also zuerst entscheiden, was genau ausgegeben werden soll, und dann, wenn Sie Zeichen mit Backslash schützen müssen. Wenn Sie dies nicht tun, können Sie einfach einen gefalteten Stil ohne Escaping oder einen einfachen Anführungszeichenstil verwenden, indem Sie den ' oder einen doppelten Anführungszeichenstil verwenden, indem Sie " und einen beliebigen \ abhaken. Wenn Sie \ brauchen, ist das Aufheben eines doppelten Anführungszeichens Ihre einzige Option.

3
Anthon

Ich glaube nicht, dass das etwas mit Flucht zu tun hat. Aus den docs für command :

Das Befehlsmodul verwendet 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 über die Shell verarbeitet, daher funktionieren Variablen wie $HOME und Operationen wie "<", ">", "|" und "&" nicht (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 Shell eingebaut. Es ist sinnvoll, wenn Ansible den Befehl nicht über eine Shell ausführt, die von Shell nicht verfügbar ist, ergo "Keine solche Datei oder ein solches Verzeichnis".

Wie in den Dokumenten beschrieben, können Sie Shell anstelle von command verwenden, aber ich bin nicht sicher, ob dies eine Lösung ist, da Ansible nachfolgende Befehle wahrscheinlich nicht in derselben Shell ausführt, also alle zuvor festgelegten Umgebungsvariablen abwesend sein. In den Antworten auf diese Frage finden Sie einige Optionen, die wahrscheinlich funktionieren: Wie setze ich Linux-Umgebungsvariablen mit Ansible?

0
Jordan Running