ITよろづや

ITの参考になる情報を備忘録代わりに残していきます

Ansible shellで複数行のシェルスクリプトを実行する方法

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"
      date

    chdir: /home/vagrant/

 

実際に動作するかどうかは別途、情報をアップします。

 

【2021年モデル】パナソニック ラムダッシュ リニア メンズシェーバー 6枚刃 洗浄器付き クラフトブラック ES-LS9AX-K