web-dev-qa-db-ja.com

同じ文字列内でYAMLの二重引用符と単一引用符をエスケープする方法

環境変数を設定するには、Ansible Playbookで一重引用符と二重引用符を適切にエスケープする必要があります。これはどれも機能しません:

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

これを見た:

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

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

私が得るエラーメッセージは次のとおりです。

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

>は、ブロックスカラーを開始します。ブロックスカラーでは、何もエスケープする必要はありません(エスケープシーケンスは処理されません)。したがって、JSONのような値を単一引用符で囲むと仮定した場合は、次のようにします。

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

編集:また、折り畳まれたスカラーにはデフォルトで末尾の改行文字が含まれることに注意してください。これを使いたくない場合は、>- の代わりに >

20
flyx

フォールドスタイルスカラー(>で導入)を使用しており、YAML 1.2仕様に従って文字をエスケープすることはできません。

折り畳まれたスカラー:

折り畳まれたスタイルは「>」インジケータで示されます。リテラルスタイルに似ています。ただし、折りたたまれたスカラーは行の折り畳みの対象となります。

また、関連するテキストはリテラルスタイルのスカラーでエスケープされます。

リテラルスカラー内では、空白文字を含むすべての(インデントされた)文字がコンテンツと見なされます。すべての改行文字が正規化されていることに注意してください。さらに、最終行の改行と後続の空行は途切れますが、空行は折り畳まれません。

あなたの例から、あなたが本当に何をしたいのかは明らかではありません。おそらく二重引用符スタイルを支持して、折りたたみスタイルをドロップする必要があります。

二重引用符で囲まれたスタイルは、周囲の「 "」インジケータによって指定されます。これは、「\」エスケープシーケンスを使用して、任意の文字列を表現できる唯一のスタイルです。文字。

または一重引用符で囲まれたスタイル:

一重引用符で囲まれたスタイルは、周囲の「 '」インジケータによって指定されます。したがって、単一引用符で囲まれたスカラー内では、そのような文字を繰り返す必要があります。これは、単一引用符で囲まれたスカラーで実行される唯一のエスケープ形式です。特に、「\」および「 "」文字は自由に使用できます。これにより、単一引用符で囲まれたスカラーが印刷可能文字に制限されます。さらに、スペース文字がnon- -スペース。

したがって、最初に出力を正確に決定し、次にバックスラッシュで文字をエスケープする必要がある場合に決定する必要があります。そうでない場合は、エスケープせずに折りたたみスタイルを使用するか、'をエスケープする単一引用符スタイル、または"\をエスケープする二重引用符スタイルを使用できます。 \が必要な場合は、二重引用符で囲まれたスタイルをエスケープすることが唯一のオプションです。

4
Anthon

これはエスケープとは関係ないと思います。 commandのドキュメント から:

コマンドモジュールは、コマンド名の後にスペースで区切られた引数のリストを取ります。指定したコマンドは、選択したすべてのノードで実行されます。シェルを介して処理されないため、$HOMEなどの変数や"<"">""|""&"などの操作は機能しません( シェル これらの機能が必要な場合はモジュール)。

実行しようとしているコマンドexportは、実行可能ファイルではありません。それはシェル組み込みです。 Ansibleがシェルを介してコマンドを実行していない場合、Shellビルトインを使用できない場合は、「No such file or directory」と入力してください。

ドキュメントが言うように、Shellの代わりに command を使用できますが、Ansibleはおそらく後続のコマンドを実行しないため、これが解決策かどうかわかりません同じシェルで、以前に設定した環境変数は存在しません。動作する可能性が高いいくつかのオプションについては、この質問への回答を参照してください。 ansibleでLinux環境変数を設定する方法

0
Jordan Running