如何在Ansible(脚本模块)

时间:2016-09-19 19:37:19

标签: ansible

我对Ansible(2.x)很新,我在使用脚本模块和使用双引号和反斜杠传递参数时遇到了麻烦。

假设我们有一个包含字符串“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中转义反斜杠和双引号?

2 个答案:

答案 0 :(得分:7)

不要因为ansible-playbook以JSON编码形式打印调试消息而感到困惑,因此有些字符会被转义。

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

您的语法正确。如果arg的值为\(-name "bar" \),则会将foo设置为bar
但在这种情况下,调试消息将如下所示:

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

请注意,JSON("\)的特殊字符会被转义。

但是将此作为参数传递可能存在一些问题 如果你打电话给你脚本,就像这样

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

参数字符串看起来像这个"\(-name "bar" \)",实际上是bash中的3个连接字符串:\(-name + bar + \),所以你会在<{1}}周围松开双引号EM>杆

如果要保留这些双引号,请使用:

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

答案 1 :(得分:1)

你非常接近。我想你想设置一个变量,而不是事实,我建议你使用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