今私はそれが複数の行にあった場合はるかに読みやすいはずのansibleでシェルスクリプトを使用しています
- name: iterate user groups
shell: groupmod -o -g {{ item['guid'] }} {{ item['username'] }} ....more stuff to do
with_items: "{{ users }}"
Ansibleシェルモジュールで複数行スクリプトを許可する方法がわからない
今私はそれが複数の行にあった場合はるかに読みやすいはずの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
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 }}
シェルコマンドは、次のように1行に折りたたまれています。 ls --color /home
>
には非常に特定の意味があります。私はこれを試してみましたが、期待通りに動作しませんでした。