Ansible Script モジュール

AnsibleBeginner
オンラインで実践に進む

はじめに

この実験では、Ansible Script モジュールを使用してリモート ホストでカスタム スクリプトを実行する方法を学びます。Script モジュールを使用すると、対象のホストで任意のプログラミング言語で書かれたスクリプトを実行でき、自動化タスクに柔軟性とカスタマイズオプションを提供します。

単純なスクリプトを実行する

このステップでは、Ansible Script モジュールを使用してリモート ホストで単純なスクリプトを実行します。

まず、/home/labex/project/script-module-playbook.yaml という名前の新しい Ansible プレイブック ファイルを作成し、テキスト エディタで開きます。
プレイブック ファイルに次の内容を追加します。

- hosts: localhost
  tasks:
    - name: Execute a simple script
      script: /home/labex/project/simple_script.sh
      register: script_output

    - name: Display script output
      debug:
        var: script_output.stdout_lines
  • hosts: これは、プレイブックを実行する対象のホストを指定します。この場合、対象のホストが "localhost" なので、プレイブックはローカル ホストで実行されます。
  • tasks: 実行するタスクのリストです。
  • name: これは、タスクの目的を識別するタスクの説明的な名前です。
  • script: これは、タスクが実行する実際のコマンドです。対象のホスト上の "/home/labex/project/" ディレクトリにある "simple_script.sh" という名前のスクリプトを実行するように Ansible に指示します。
  • register: これは、後でプレイブックで使用するために、script_output 変数にスクリプトの出力を登録します。
  • debug: これは、デバッグ情報を表示するために使用する Ansible モジュールです。
  • var: これは、デバッグ モジュールのパラメータで、前のタスクのスクリプトの標準出力を表示します。script_output.stdout_lines には、スクリプトの出力の各行が含まれています。

要約すると、このプレイブックの主な目的は、ローカル ホストでスクリプトを実行し、実行後のスクリプトの標準出力を表示することです。登録された script_output 変数には、スクリプトの出力が含まれており、その後、Debug モジュールを使用して表示されます。

次に、次の内容を持つ /home/labex/project/simple_script.sh という名前の単純なスクリプト ファイルを作成します。

#!/bin/bash
echo "This is a simple script."

スクリプト ファイルが実行可能であることを確認し (chmod +x simple_script.sh)、スクリプト ファイルをプレイブックで指定された /home/labex/project/ ディレクトリに配置します。

最後に、次のコマンドでプレイブックを実行します。

chmod +x simple_script.sh
ansible-playbook script-module-playbook.yaml

プレイブック実行出力に表示されるスクリプトの出力を確認します。
出力例:

...
PLAY [localhost] ***************************************************************

TASK [Gathering Facts] *********************************************************
ok: [localhost]

TASK [Execute a simple script] *************************************************
changed: [localhost]

TASK [Display script output] ***************************************************
ok: [localhost] => {
    "script_output.stdout_lines": [
        "This is a simple script."
    ]
}

PLAY RECAP *********************************************************************
localhost                  : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

ここで "This is a simple script." は、simple_script.sh スクリプトの出力です。

スクリプトに変数を渡す

このステップでは、Ansible プレイブックから変数を Script モジュールを使用して実行するスクリプトに渡す方法を学びます。

まず、既存のプレイブック ファイルの内容をすべて削除し、次の内容を追加して修正します。

- hosts: localhost
  tasks:
    - name: Execute script with a variable
      script: /home/labex/project/var_script.sh "{{ message }}"
      register: variable_script_output

    - name: Display variable script output
      debug:
        var: variable_script_output.stdout_lines
  • script: これは、タスクが実行する実際のコマンドです。そして {{ message }} は、スクリプトに渡される変数です。二重の波括弧は、これが Ansible 変数であることを示しており、その値は実行時に動的に置き換えられます。
  • register: これは、後でプレイブックで使用するために、スクリプトの出力を "variable_script_output" 変数に登録します。
  • debug: これは、デバッグ情報を表示するために使用する Ansible モジュールです。
  • var: このデバッグ モジュールのパラメータは、前のタスクのスクリプトの標準出力を表示します。variable_script_output.stdout_lines には、スクリプトの出力の各行が含まれています。

要約すると、このプレイブックは、ローカル ホストでスクリプトを実行し、"message" と呼ばれる変数をスクリプトに渡します。スクリプトの出力は variable_script_output 変数に登録され、その後、debug モジュールを使用して表示されます。

次に、次の内容を持つ /home/labex/project/var_script.sh という名前の単純なスクリプト ファイルを作成します。

#!/bin/bash
echo $1

スクリプト ファイルが実行可能であることを確認し (chmod +x var_script.sh)、スクリプト ファイルをプレイブックで指定された /home/labex/project/ ディレクトリに配置します。

最後に、プレイブックを実行する際に -e オプションを使用して message 変数を追加変数として渡します。

chmod +x var_script.sh
ansible-playbook script-module-playbook.yaml -e "message=Hello,Ansible"

提供されたメッセージ付きのスクリプトの出力を確認します。
出力例:

...
PLAY [localhost] ***************************************************************

TASK [Gathering Facts] *********************************************************
ok: [localhost]

TASK [Execute script with a variable] ******************************************
changed: [localhost]

TASK [Display variable script output] ******************************************
ok: [localhost] => {
    "variable_script_output.stdout_lines": [
        "Hello,Ansible"
    ]
}

PLAY RECAP *********************************************************************
localhost                  : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

ここで "Hello,Ansible" は、simple_script.sh スクリプトの出力です。

スクリプトの失敗を処理する

このステップでは、Script モジュールを使用してスクリプトを実行する際に、スクリプトの失敗をどのように処理するかを学びます。スクリプトが非ゼロの終了ステータスを返し、失敗を示す場合を処理します。

まず、既存のプレイブック ファイルの内容をすべて削除し、次の内容を追加して修正します。

- hosts: localhost
  tasks:
    - name: Execute a failing script
      script: /home/labex/project/failing_script.sh
      register: failing_script_output
      ignore_errors: yes

    - name: Handle script failure
      debug:
        msg: "The script failed. Performing fallback action."
      when: failing_script_output.failed
  • script: これは、タスクが実行する実際のコマンドです。
  • register: これは、後でプレイブックで使用するために、スクリプトの出力を "failing_script_output" 変数に登録します。
  • ignore_errors: このパラメータは yes に設定されており、このスクリプト タスクが失敗しても Ansible が続けて後続のタスクを実行できるようにします。失敗は failing_script_output 変数に記録されます。
  • debug: これは、デバッグ情報を表示するために使用する Ansible モジュールです。
  • msg: このデバッグ モジュールのパラメータは、スクリプトが失敗したことを示すメッセージを表示します。このタスクは、前のタスク (failing_script_output) が失敗した場合にのみ実行されます。
  • when: この条件により、このタスクは最初のタスクのスクリプトが失敗した場合にのみ実行されることが保証されます。スクリプトが成功した場合は、このタスクはスキップされます。

要約すると、このプレイブックは失敗する可能性のあるスクリプトを実行しようとします。スクリプトが失敗した場合、プレイブックはデバッグ メッセージを表示し、フォールバック アクションを実行することで失敗を処理します。ignore_errors: yes パラメータにより、スクリプトが失敗してもプレイブックが続行し、when: failing_script_output.failed 条件により、処理タスクが必要なときにのみ実行されることが保証されます。

次に、次の内容を持つ /home/labex/project/failing_script.sh という名前の失敗するスクリプト ファイルを作成します。

#!/bin/bash
exit 1

スクリプト ファイルが実行可能であることを確認し (chmod +x failing_script.sh)、スクリプト ファイルをプレイブックで指定された /home/labex/project/ ディレクトリに配置します。

最後に、プレイブックを実行し、ignore_errors: yes のために失敗するスクリプトが実行されるものの無視されることを確認します。

chmod +x failing_script.sh
ansible-playbook script-module-playbook.yaml

プレイブックは、失敗を示すデバッグ メッセージを表示し、フォールバック アクションを実行します。
出力例:

...
PLAY [localhost] ***************************************************************

TASK [Gathering Facts] *********************************************************
ok: [localhost]

TASK [Execute a failing script] ************************************************
fatal: [localhost]: FAILED! => {"changed": true, "msg": "non-zero return code", "rc": 1, "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": []}
...ignoring

TASK [Handle script failure] ***************************************************
ok: [localhost] => {
    "msg": "The script failed. Performing fallback action."
}

PLAY RECAP *********************************************************************
localhost                  : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=1

"msg": "The script failed. Performing fallback action." は、failing_script.sh スクリプトの実行に失敗したことを示しています。

まとめ

おめでとうございます!あなたは Ansible Script モジュールの実験を成功裏に完了しました。リモート ホストでカスタム スクリプトを実行し、スクリプトに変数を渡し、スクリプトの失敗を処理する方法を学びました。

Script モジュールは、カスタム スクリプトの力を活用することで、自動化タスクに大きな柔軟性とカスタマイズオプションを提供します。ただし、セキュリティ上の脆弱性を防止するために、安全で信頼性の高いスクリプトを書き、入力を検証することを確認してください。

Script モジュールを十分に理解したので、Ansible プレイブックに組み込んで、さまざまなタスクを自動化し、より高度な自動化シナリオを実現することができます。Ansible でのスクリプト作成を楽しんでください!