如何在 Ansible 使用多行 shell 脚本

现在我正在使用一个可视的 shell 脚本,如果它在多行上,那么它的可读性会更好

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

只是不确定如何在 Ansible shell 模块中使用多行脚本

181773 次浏览

尝试使用安塞尔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中所示

参考文献(2021年访问) : Https://docs.ansible.com/ansible/latest/reference_appendices/yamlsyntax.html 搜寻表格「多行」。

安赛博在它的剧本中使用 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 }}"

有一点需要注意: Anble 会对 shell命令的参数进行一些拙劣的操作,所以尽管上面的命令通常会按预期的那样工作,但下面的命令不会:

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

Anble 实际上将使用前导空格呈现该文本,这意味着 shell 将永远不会在一行的开头找到字符串 EOF。你可以像下面这样使用 cmd参数来避免安塞尔的无用的启发式方法:

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

在 EOF 分隔符之前添加一个空格可以避免 cmd:

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

我更喜欢这种语法,因为它允许为 shell 设置配置参数:

---
- name: an example
shell:
cmd: |
docker build -t current_dir .
echo "Hello World"
date


chdir: /home/vagrant/