现在我在ansible中使用一个shell脚本,如果它在多行上会更具可读性
- name: iterate user groups
shell: groupmod -o -g {{ item['guid'] }} {{ item['username'] }} ....more stuff to do
with_items: "{{ users }}"
不确定如何在Ansible shell模块中允许多行脚本
答案 0 :(得分:170)
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
分配给key
。
您可以将此用于多行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永远不会在行的开头找到字符串EOF
。您可以使用cmd
参数来避免Ansible的无用启发式:
- shell:
cmd: |
cat <<EOF
This is a test.
EOF
答案 1 :(得分:13)
提及YAML续行。
作为一个例子(尝试使用ansible 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
答案 2 :(得分:3)
我更喜欢这种语法,因为它允许为 shell 设置配置参数:
---
- name: an example
shell:
cmd: |
docker build -t current_dir .
echo "Hello World"
date
chdir: /home/vagrant/
答案 3 :(得分:0)
在EOF分隔符之前添加一个空格可以避免使用cmd:
- shell: |
cat <<' EOF'
This is a test.
EOF