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
提到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