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


125

今私はそれが複数の行にあった場合はるかに読みやすいはずのansibleでシェルスクリプトを使用しています

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

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


1
ansible 'script'コマンドの使用と外部ファイルの使用も検討してください
Jason

回答:


273

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

27
素晴らしい答え
ブライアンハント2017

18

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 }}

シェルコマンドは、次のように1行に折りたたまれています。 ls --color /home


3
ええ、でも殻の中>には非常に特定の意味があります。私はこれを試してみましたが、期待通りに動作しませんでした。
Edgar Martinez

6
これが、最初の行だけにあり、後続の行にはない理由です。私が書いたとおり、これはansible 2.0で問題なく動作しましたが、ansible 1.9.4では完全なls出力を出力しませんでした。どのバージョンのAnsibleを使用しましたか?
Marcello Romani

リンクが切れています。
ケノーブ

2016年から、これらのことが起こります。
マルチェロロマーニ

3

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

- shell: |
    cat <<' EOF'
    This is a test.
    EOF
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.