1. ホーム
  2. shell

[解決済み] Ansibleで複数行のシェルスクリプトを実行する方法

2022-04-25 18:22:16

質問

今、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\nkey .

  • | 文字はリテラルブロック演算子です。 これはおそらく、複数行のシェルスクリプトのために必要なものでしょう。次のような構文になります。

    key: |
      This text
      has multiple
      lines
    
    

    値を割り当てる This text\nhas multiple\nlines\nkey .

このように複数行のシェルスクリプトに使用できます。

- name: iterate user groups
  shell: |
    groupmod -o -g {{ item['guid'] }} {{ item['username'] }} 
    do_some_stuff_here
    and_some_other_stuff
  with_items: "{{ users }}"

1つ注意点があります。 shell コマンドを使用するため、上記は一般的に期待通りに動作しますが、以下は期待通りには動作しません。

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

Ansibleは実際にそのテキストを先行するスペースでレンダリングします。 EOF を行頭に置くことができます。 Ansibleの役に立たないヒューリスティックを避けるには、行頭で cmd パラメータは次のようになります。

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