2016-09-19 64 views
1

私は非常に新しくて(2.x)、スクリプトモジュールを使用して二重引用符とバックスラッシュでパラメータを渡すのに問題があります。Ansible(スクリプトモジュール)でバックスラッシュと二重引用符をエスケープする方法

我々は、設定された変数の文字列「foo」を含んでいる{{foo}}を持っていると仮定すると、私が持っているこのようなタスク:

set_fact: arg: \(-name "{{foo}}" \) name: call shell module script: path/somescript.sh "{{arg}}"

私のスクリプトが動作するためには、引数の次のような構造を必要とします:

arg: \(-name \""{{foo}}"\" \)   result: \\(-name \"foo\" \\) 

arg: '\(-name \""{{foo}}"\" \)'   result: \\(-name \"foo\" \\) 

arg: \\(-name \""{{foo}}"\" \\)   result: \\(-name \"foo\" \\) 
\(-name "foo" \) 

は、私は、次のようないくつかのことを試してみました

Ansibleでバックスラッシュと二重引用符をエスケープすることはできますか?

答えて

1

ansible-脚本はので、いくつかの文字がエスケープされ、JSONエンコード形式でデバッグメッセージを出力しているという事実によって混同しないでください。

set_fact: 
    arg: \(-name "{{foo}}" \) 

正しい構文があります。 fooの値がbarの場合、arg\(-name "bar" \)に設定します。
しかし、この場合のデバッグメッセージは次のようになります。JSON("\)のための特殊文字がエスケープされていることを

ok: [localhost] => { 
    "arg": "\\(-name \"bar\" \\)" 
} 

注意。

ただし、これをパラメータとして渡す際に問題が発生することがあります。
bashで実際に3連結文字列である。この"\(-name "bar" \)"ようになります。この

script: path/somescript.sh "{{arg}}" 

パラメータ文字列のように、スクリプトあなたを呼び出す場合:バーの周りに二重引用符を失うことになるので、\(-name + bar + \)

あなたがそれらの二重引用符、使用保存したい場合:

script: path/somescript.sh '{{arg}}' 
+0

一重引用符が解決策の鍵でした。あなたが正しいとすれば、文字は最終的にスクリプトに渡されるときにエスケープされます。私はあまりにも評判が低いので、私はupvoteすることはできませんが、私の感謝はあなたです:-) – Vetemi

0

あなたはとても近くです。私はあなたが変数を設定したいと思うと思いますが、shellモジュールをscriptモジュールの代わりに使用することをお勧めします。 shellは、複雑なシェルコマンドをエスケープしたりクォートしたりする場合に、より寛容です。

--- 
- hosts: localhost 
    vars: 
    foo: test.yml 
    arg: \(-name "{{ foo }}" \) 
    tasks: 
    - debug: var=arg 
    - shell: find . {{ arg }} 
     register: find 
    - debug: var=find.stdout_lines 

、出力は:

$ ansible-playbook test.yml 

PLAY [localhost] *************************************************************** 

TASK [debug] ******************************************************************* 
ok: [localhost] => { 
    "arg": "\\(-name \"test.yml\" \\)" 
} 

TASK [command] ***************************************************************** 
changed: [localhost] 

TASK [debug] ******************************************************************* 
ok: [localhost] => { 
    "find.stdout_lines": [ 
     "./test.yml" 
    ] 
} 

PLAY RECAP ********************************************************************* 
localhost     : ok=3 changed=1 unreachable=0 failed=0 
+0

を私は今、シェルスクリプトを使用しています。 Konstatin Suvorov(引数としてスクリプトに渡すときの一重引用符)の答えと組み合わせて、これは私を助けました。どうもありがとうございました! – Vetemi

関連する問題