Ansibleで複数行のシェルスクリプトを実行する方法を探していたのですが、以下の情報が参考になりそうです。
情報元はこちらです。
How to do multiline shell script in Ansible - Stack Overflow
質問の抜粋です。
===
現在、私はansibleのシェルスクリプトを使用しています。これは、複数行にある場合にはるかに読みやすくなります。
- name: iterate user groups
shell: groupmod -o -g {{ item['guid'] }} {{ item['username'] }} ....more stuff to do
with_items: "{{ users }}"
Ansibleシェルモジュールで複数行のスクリプトを許可する方法がわからない
===
続いて、回答内容の抜粋です。
===
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
===
シェルの構成パラメーターを設定できるので、この構文が好きです。
---
- name: an example
shell:
cmd: |
docker build -t current_dir .
echo "Hello World"
datechdir: /home/vagrant/
実際に動作するかどうかは別途、情報をアップします。
【2021年モデル】パナソニック ラムダッシュ リニア メンズシェーバー 6枚刃 洗浄器付き クラフトブラック ES-LS9AX-K |