web-dev-qa-db-ja.com

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

現在、私はansibleにシェルスクリプトを使用しています。

- name: iterate user groups
  Shell: groupmod -o -g {{ item['guid'] }} {{ item['username'] }} ....more stuff to do
  with_items: "{{ users }}"

Ansible Shellモジュールで複数行のスクリプトを許可する方法がわからない

87
Edgar Martinez

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つ注意点があります:AnsibleはShellコマンドへの引数のちょっとぎこちない操作をするので、上記は通常期待通りに動作しますが、以下は動作しません。

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

Ansibleは実際にはそのテキストを先行スペースでレンダリングします。つまり、シェルは行の先頭に文字列EOFを見つけられません。このようにcmdパラメータを使用することでAnsibleの役に立たないヒューリスティックを避けることができます。

- Shell:
    cmd: |
      cat <<EOF
      This is a test.
      EOF
175
larsks

https://support.ansible.com/hc/en-us/articles/201957837-How-do-I-split-an-action-into-a-multi-line-format-

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行にまとめられています。

14
Marcello Romani

EOF区切り文字の前にスペースを追加すると、cmdを回避できます。

- Shell: |
    cat <<' EOF'
    This is a test.
    EOF
0
Id2ndR