Ansible コマンドモジュールでターゲットホスト上でコマンドを実行する方法

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

はじめに

Ansible は、リモートシステムの管理を簡素化する強力な IT オートメーションツールです。このチュートリアルでは、ターゲットホスト上でコマンドを実行できる Ansible コマンドモジュールを探ります。コマンド実行の基本、および Ansible ワークフローを強化するための高度なテクニックを学習します。

Ansible コマンドモジュールの理解

Ansible は、複数のホスト全体でインフラストラクチャを管理および設定できる強力なオープンソースの自動化ツールです。Ansible コマンドモジュールは、Ansible の主要なモジュールの一つであり、リモートホスト上で任意のコマンドを実行することを可能にします。

Ansible コマンドモジュールは、ターゲットホスト上でコマンドを実行するためのシンプルで分かりやすい方法を提供します。シェルコマンド、スクリプト、またはリモートシステム上のその他の実行可能ファイルを実行できます。このモジュールは、アドホックなタスクの実行、問題のトラブルシューティング、またはインフラストラクチャ上でカスタムコマンドを実行する必要がある場合に特に役立ちます。

Ansible コマンドモジュールを使用するには、Ansible プレイブックまたはアドホックコマンドで command パラメータを定義する必要があります。command パラメータは、リモートホスト上で実行するコマンドを指定します。たとえば:

- name: リモートホスト上でコマンドを実行する
  command: uptime
  register: uptime_result
  become: yes

この例では、command パラメータは uptime に設定されています。これにより、リモートホスト上で uptime コマンドが実行されます。register パラメータは、コマンドの出力をキャプチャするために使用され、become パラメータは yes に設定されているため、(必要に応じて)昇格した権限でコマンドを実行します。

Ansible コマンドモジュールは、次のさまざまなオプションもサポートしています。

  • creates: コマンドを実行する前にファイルが存在する必要があることを指定します。
  • removes: コマンドを実行する前にファイルが存在してはならないことを指定します。
  • chdir: コマンドを実行する前に、現在の作業ディレクトリを指定されたパスに変更します。
  • stdin: 指定された文字列を標準入力経由でコマンドに渡します。
  • warn: 重要なファイルの変更の可能性がある場合に警告を表示するかどうかを制御します。

Ansible コマンドモジュールを理解することで、リモートホスト上で効率的にコマンドを実行し、反復的なタスクを自動化し、インフラストラクチャ管理プロセスを合理化できます。

リモートホスト上でのコマンド実行

基本的なコマンド実行

Ansible コマンドモジュールを使用してリモートホスト上でコマンドを実行するには、以下の基本的な構文を使用します。

- name: リモートホスト上でコマンドを実行する
  command: <command>
  register: <result_variable>
  become: yes

この例で、<command> はリモートホスト上で実行する実際の命令であり、<result_variable> はコマンドの実行結果を格納する変数です。become パラメータを yes に設定すると、(必要に応じて)昇格した権限でコマンドを実行します。

たとえば、リモートホストの稼働時間を確認するには:

- name: リモートホストの稼働時間を確認する
  command: uptime
  register: uptime_result
  become: yes

uptime コマンドの出力が uptime_result 変数に格納されます。その後、この変数をプレイブックやアドホックコマンドで使用できます。

コマンドエラーの処理

デフォルトでは、Ansible コマンドモジュールは、実行されたコマンドがゼロ以外の終了コードを返した場合に失敗します。ignore_errors パラメータを使用してコマンドエラーを処理できます。

- name: リモートホスト上でコマンドを実行する
  command: <command>
  register: <result_variable>
  ignore_errors: yes

これにより、コマンドが失敗した場合でも、プレイブックの実行を継続できます。

コマンド出力の取得

前の例に示されているように、register パラメータを使用してコマンドの出力を取得できます。出力は、指定された変数に格納され、その後、プレイブックやアドホックコマンドで使用できます。

たとえば、uptime コマンドの出力を取得して表示するには:

- name: リモートホストの稼働時間を確認する
  command: uptime
  register: uptime_result
  become: yes

- name: 稼働時間を表示する
  debug:
    msg: "{{ uptime_result.stdout }}"

これにより、uptime コマンドの出力がコンソールに表示されます。

Ansible コマンドモジュールを使用してリモートホスト上でコマンドを実行する基本を理解することで、インフラストラクチャ内の幅広いタスクを効果的に自動化できます。

高度なコマンド実行テクニック

条件付きコマンド実行

特定の条件が満たされた場合にのみコマンドを実行したい場合があります。when 句を使用して、Ansible プレイブック内で条件付きでコマンドを実行できます。

- name: 条件が満たされた場合にコマンドを実行する
  command: <command>
  when: <condition>
  register: <result_variable>
  become: yes

この例では、<condition> が真の場合にのみ、<command> が実行されます。

たとえば、システムの空きメモリが 20% 未満の場合にのみ free コマンドを実行するには:

- name: 空きメモリを確認する
  command: free -m
  register: memory_result
  become: yes

- name: 空きメモリが 20% 未満の場合にコマンドを実行する
  command: <実行するコマンド>
  when: (memory_result.stdout_lines[1].split()[3]|int / memory_result.stdout_lines[1].split()[1]|int * 100) < 20
  register: <result_variable>
  become: yes

コマンドのループ処理

ループを使用して、単一のタスク内で複数のコマンドを実行することもできます。Ansible コマンドモジュールは、この目的のために loop パラメータをサポートしています。

- name: 複数のコマンドを実行する
  command: "{{ item }}"
  loop:
    - <command1>
    - <command2>
    - <command3>
  register: <result_variable>
  become: yes

この例では、指定されたコマンド (<command1>, <command2>, <command3>) が順番に実行され、出力は <result_variable> に格納されます。

コマンドのタイムアウト処理

デフォルトでは、Ansible はコマンドが完了するまで無期限に待ちます。ただし、timeout パラメータを使用して、コマンド実行のタイムアウトを設定できます。

- name: タイムアウト付きでコマンドを実行する
  command: <command>
  timeout: 60
  register: <result_variable>
  become: yes

この例では、コマンドの実行に 60 秒以上かかる場合、コマンドは終了します。

これらの高度なコマンド実行テクニックを習得することで、Ansible の自動化機能をさらに強化し、インフラストラクチャ管理のさまざまなシナリオに対応できます。

まとめ

この Ansible チュートリアルでは、コマンドモジュールを使用してリモートホスト上でコマンドを実行する方法を網羅的に解説しました。基本的な理解と高度なテクニックを学ぶことで、Ansible の機能を活用し、IT 運用を効率化し、インフラストラクチャ全体の効率向上に貢献できます。