2016-09-19 57 views
1

我對ansible(2.x)非常陌生,並且在使用腳本模塊和傳遞帶雙引號和反斜槓的參數時遇到問題。如何在Ansible中避免反斜槓和雙引號(腳本模塊)

假設我們有一組變量{{foo}}其中包含一個字符串「foo」,我有這樣的任務:

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

我的腳本需要論證的以下結構才能工作:

\(-name "foo" \) 

我試了好東西,如:

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

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

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

是否可以在Ansible中避免反斜槓和雙引號?

回答

1

不要在JSON ansible,劇本打印調試消息編碼形式,所以某些字符轉義的事實混淆。

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

您有正確的語法。如果foo的值爲bar,這將設置arg\(-name "bar" \)
但在這種情況下,調試消息看起來就像這樣:

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

注意,對於JSON("\)特殊字符轉義。

但是,將此參數作爲參數傳遞可能存在一些問題。
如果打電話給你的腳本,這樣

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

參數字符串像這樣"\(-name "bar" \)"這是在bash實際上3連接的字符串:\(-name + bar + \),那麼你將失去周圍的酒吧雙引號。

如果你想保留這些雙引號,使用方法:

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

單引號是解決問題的關鍵。而且你是對的,角色在傳遞給劇本時最終會逃脫。我無法贊成,因爲我的聲譽太低了,但我的感謝是你的:-) – Vetemi

0

你非常接近。我想你想設置一個變量,而不是事實,我建議你使用shell模塊,而不是script模塊。 shell在轉義和引用複雜的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

我使用的shell腳本了。結合康斯坦丁蘇沃洛夫的答案(單引號傳遞給腳本作爲arg時),這幫助了我。非常感謝你! – Vetemi