2016-12-14 20 views
3

環境にJSON文字列を渡そうとしています。環境からシェルモジュールへのJSON文字列の受け渡し

- name: Start {{service_name}} 
    shell: "<<starting springboot jar>> --server.port={{service_port}}\"" 
    environment: 
    - SPRING_APPLICATION_JSON: '{"test-host.1":"{{test_host_1}}","test-host.2":"{{test_host_2}}"}' 

test_host_1は172.31.00.00

test_host_2は172.31.00.00

です。しかし春のログに、私はそれを見て、二重引用符として

Caused by: com.fasterxml.jackson.core.JsonParseException: Unexpected character (''' (code 39)): was expecting double-quote to start field name 
at [Source: {'test-host.1': '172.31.00.00', 'test-host.2': '172.31.00.00'}; line: 1, column: 3] 

を出力JSON解析例外を取得一重引用符に変換されます!!!

私は二重引用符をエスケープしようとしましたが運がありませんでした。

なぜそれが起こるか、または何らかの回避策がありますか?

答えて

3

Ansibleテンプレートエンジンに関することがあります。
文字列がオブジェクトのように見える場合({または[で始まる)、それをオブジェクトに変換します。 codeを参照してください。

- SPRING_APPLICATION_JSON: "{{ {'test-host.1':test_host_1,'test-host.2':test_host_2} | to_json }}" 

P.S.:

これを防ぐには、STRING_TYPE_FILTERSのいずれかを使用しますこれはなぜ@ techrafの答えからのスペース文字を使ったハックです:Anonymousはstartswith("{")の比較に失敗し、文字列をオブジェクトに変換しません。

+0

私はあなたが実際に '|文字列}} 'not' | to_json}} '。 – techraf

+0

いいえ、 'to_json'は正しいです。 OPはJSON文字列を必要としていたので、私はpython dictを作成し、それをJSONに変換しました。 –

+0

文字列を文字列として出力することができません。それは常に入力を処理して、順序を '{" test-host.2 ":" test2 "、" test-host.1 ":" test1 "}'(JSONの場合は順序は関係ありませんそれは文字列型の環境変数に保存されます)。 Ansibleが別の答えで示唆したように式を閉じるときに暗黙的に変換すると、それをそのまま残すためにどのフィルタを使うことができますか?なぜ '|文字列 'はここでは動作しませんか?それは入力を処理するようです。 – techraf

2

クイックハック:(最初の単一引用符の後に)変数の定義にスペースを追加 - 単一のスペースは、実際の変数の値には影響しません(スペースは無視されます):

- name: Start {{service_name}} 
    shell: "<<starting springboot jar>> --server.port={{service_port}}\"" 
    environment: 
    - SPRING_APPLICATION_JSON: ' {"test-host.1":"{{test_host_1}}","test-host.2":"{{test_host_2}}"}' 

SPRING_APPLICATION_JSON='"'"' {"test-host.1":"test1","test-host.2":"test2"}'"'"' 

スペースなし::Ansibleはシェルに渡す空間では(test1test2は私が設定した値です)

SPRING_APPLICATION_JSON='"'"'{'"'"'"'"'"'"'"'"'test-host.2'"'"'"'"'"'"'"'"': '"'"'"'"'"'"'"'"'test2'"'"'"'"'"'"'"'"', '"'"'"'"'"'"'"'"'test-host.1'"'"'"'"'"'"'"'"': '"'"'"'"'"'"'"'"'test1'"'"'"'"'"'"'"'"'}'"'"' 

順番も逆です。スペースなしのように、スペースを文字列としてJSONを解釈します。

私はそれを得ないでしょう、明日の朝です。

+0

ありがとうございます。私たちは今号で数時間頭を打っています>< – mveroone

関連する問題