現在、私はansibleにシェルスクリプトを使用しています。
- 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
に割り当てます。
|
文字は、リテラルブロック演算子です。これはおそらく複数行のシェルスクリプトに必要なものです。以下の構文
key: |
This text
has multiple
lines
値This text\nhas multiple\nlines\n
をkey
に割り当てます。
これを次のような複数行のシェルスクリプトに使用できます。
- name: iterate user groups
Shell: |
groupmod -o -g {{ item['guid'] }} {{ item['username'] }}
do_some_stuff_here
and_some_other_stuff
with_items: "{{ users }}"
1つ注意点があります:AnsibleはShell
コマンドへの引数のちょっとぎこちない操作をするので、上記は通常期待通りに動作しますが、以下は動作しません。
- Shell: |
cat <<EOF
This is a test.
EOF
Ansibleは実際にはそのテキストを先行スペースでレンダリングします。つまり、シェルは行の先頭に文字列EOF
を見つけられません。このようにcmd
パラメータを使用することでAnsibleの役に立たないヒューリスティックを避けることができます。
- Shell:
cmd: |
cat <<EOF
This is a test.
EOF
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
のように1行にまとめられています。
EOF区切り文字の前にスペースを追加すると、cmdを回避できます。
- Shell: |
cat <<' EOF'
This is a test.
EOF