现在我正在使用一个可视的 shell 脚本,如果它在多行上,那么它的可读性会更好
- name: iterate user groups shell: groupmod -o -g {{ item['guid'] }} {{ item['username'] }} ....more stuff to do with_items: "{{ users }}"
只是不确定如何在 Ansible shell 模块中使用多行脚本
尝试使用安塞尔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中所示
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。
This text has multiple lines\n
key
|字符是一个文本块运算符。这可能就是多行 shell 脚本所需要的。以下语法:
|
key: | This text has multiple lines
将值 This text\nhas multiple\nlines\n赋给 key。
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 }}"
有一点需要注意: Anble 会对 shell命令的参数进行一些拙劣的操作,所以尽管上面的命令通常会按预期的那样工作,但下面的命令不会:
shell
- shell: | cat <<EOF This is a test. EOF
Anble 实际上将使用前导空格呈现该文本,这意味着 shell 将永远不会在一行的开头找到字符串 EOF。你可以像下面这样使用 cmd参数来避免安塞尔的无用的启发式方法:
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/