Ansible中如何做多行shell脚本

现在我正在使用一个shell脚本,如果它是多行的,那么这个脚本将更具可读性

- name: iterate user groups shell: groupmod -o -g {{ item['guid'] }} {{ item['username'] }} ....more stuff to do with_items: "{{ users }}" 

只是不知道如何允许Ansible shell模块中的多行脚本

Ansible在其手册中使用了YAML语法。 YAML有一些块操作符:

  • >是一个折叠块操作符。 也就是说,它通过空格将多条线连接在一起。 以下语法:

     key: > This text has multiple lines 

    将分配值This text has multiple lines\n key

  • | 字符是一个文字块操作符。 这可能是你想要的多行shell脚本。 以下语法:

     key: | This text has multiple lines 

    将键值分配给This text\nhas multiple\nlines\n

你可以像这样使用这个多行shell脚本:

 - name: iterate user groups shell: | groupmod -o -g {{ item['guid'] }} {{ item['username'] }} do_some_stuff_here and_some_other_stuff with_items: "{{ users }}" 

有一点需要注意的是:Ansible对shell命令的参数进行了一些简单的操作,所以虽然上面的操作一般可以正常工作,但是下面不会:

 - shell: | cat <<EOF This is a test. EOF 

Ansible实际上会使用前导空格来显示该文本,这意味着shell将永远不会在行的开头findstringEOF 。 你可以通过使用像这样的cmd参数来避免Ansible的无益的启发式:

 - shell: cmd: | cat <<EOF This is a test. EOF 

https://support.ansible.com/hc/en-us/articles/201957837-How-do-I-split-an-action-into-a-multi-line-format-

提到YAML线延续。

作为一个例子(试用2.0.0.2):

 --- - hosts: all tasks: - name: multiline shell command shell: > ls --color /home register: stdout - name: debug output debug: msg={{ stdout }} 

shell命令被合并为一行,如在ls --color /home