Ansible での「到達不能 (unreachable)」と「失敗 (failed)」エラーのデバッグ方法

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

はじめに

強力なインフラ自動化ツールである Ansible は、Playbook の実行中に「到達不能 (unreachable)」や「失敗 (failed)」のエラーに遭遇することがあります。このチュートリアルでは、これらの問題の特定、理解、解決のプロセスを案内し、信頼性が高く効率的な Ansible ベースの環境を維持するのに役立ちます。

Ansible での「到達不能 (Unreachable)」および「失敗 (Failed)」エラーの特定

「到達不能 (Unreachable)」エラーの理解

Ansible での「到達不能 (Unreachable)」エラーは、コントロールノードが管理対象ノードとの接続を確立できない場合に発生します。これは、以下のような様々な理由で起こる可能性があります。

  • 管理対象ノードが電源オフまたはオフラインです。
  • コントロールノードと管理対象ノード間の SSH 接続が正しく構成されていません。
  • ファイアウォールルールがコントロールノードと管理対象ノード間の接続をブロックしています。
  • 管理対象ノードの SSH サーバーが実行されていないか、アクセスできません。

「到達不能 (Unreachable)」エラーを特定するには、Ansible の出力で以下のようなものを探すことができます。

fatal: [<host>] => {
    "msg": "SSH Error: data could not be sent to the remote host. Make sure this host can be reached over ssh",
    "unreachable": true
}

「失敗 (Failed)」エラーの理解

Ansible での「失敗 (Failed)」エラーは、コントロールノードが管理対象ノードとの接続を確立できるが、管理対象ノードでのタスク実行が失敗した場合に発生します。これは、以下のような様々な理由で起こる可能性があります。

  • タスクのコマンドまたはモジュールが無効であるか、管理対象ノードでサポートされていません。
  • タスクのコマンドまたはモジュールが管理対象ノードでの実行中にエラーに遭遇します。
  • タスクが管理対象ノードで目的の状態を達成できません。

「失敗 (Failed)」エラーを特定するには、Ansible の出力で以下のようなものを探すことができます。

fatal: [<host>]: FAILED! => {
    "changed": false,
    "msg": "Some error message",
    "rc": 1,
    "results": []
}

「到達不能 (Unreachable)」エラーのトラブルシューティング

接続性の確認

「到達不能 (Unreachable)」エラーをトラブルシューティングする最初のステップは、コントロールノードが管理対象ノードとの接続を確立できることを確認することです。以下のコマンドを使用して接続性をテストできます。

## 管理対象ノードに ping を送信する
ping <managed_node_ip>

## 管理対象ノードに SSH 接続を試みる
ssh <managed_node_username>@<managed_node_ip>

ping または SSH 接続が失敗した場合、コントロールノードと管理対象ノードの両方のネットワーク構成とファイアウォール設定を調査する必要があります。

SSH 設定の検証

「到達不能 (Unreachable)」エラーのもう 1 つの一般的な原因は、コントロールノードと管理対象ノード間の SSH 設定に問題があることです。以下を確認することで SSH 設定を検証できます。

  • SSH キーが正しく構成されており、コントロールノードが管理対象ノードにアクセスするための必要な権限を持っていることを確認します。
  • Ansible インベントリファイルまたはタスク定義内のユーザー名、ポート、秘密鍵ファイルなどの SSH 接続パラメータを確認します。
  • 管理対象ノードで SSH サーバーが実行されており、コントロールノードからアクセスできることを確認します。

Ansible の詳細出力のデバッグ

「到達不能 (Unreachable)」エラーに関するより詳細な情報を取得するには、-vvv または -vvvv オプションを使用して Ansible 出力の詳細度を上げることができます。これにより、接続と認証プロセスに関するより詳細な情報が提供され、問題の根本原因を特定するのに役立ちます。

ansible-playbook -i inventory.yml playbook.yml -vvv

管理対象ノードの状態の確認

場合によっては、「到達不能 (Unreachable)」エラーは管理対象ノードが電源オフまたは応答していないことが原因で発生することがあります。以下のコマンドを使用して管理対象ノードの状態を確認できます。

ansible <host_pattern> -m ping

管理対象ノードが応答しない場合、管理対象ノード側の問題を調査する必要があります。たとえば、電源状態、ネットワーク接続性、またはシステムログを確認します。

「失敗 (Failed)」エラーのトラブルシューティング

タスクの構文と実行の確認

「失敗 (Failed)」エラーに遭遇した場合、最初のステップはタスクの構文と実行を確認することです。これは以下の方法で行うことができます。

  1. Ansible Playbook またはロール内のタスク定義を検証します。
  2. タスクのコマンドまたはモジュールのパラメータにエラーやタイポがないか確認します。
  3. タスクが管理対象ノードのオペレーティングシステムとソフトウェアのバージョンと互換性があることを確認します。

--check オプションを使用してタスクのドライランを実行し、潜在的な問題を特定することができます。

ansible-playbook -i inventory.yml playbook.yml --check

タスク実行のデバッグ

タスクの構文が正しい場合、タスク実行をデバッグすることで「失敗 (Failed)」エラーをさらに調査することができます。これは以下の方法で行うことができます。

  1. -vvv または -vvvv オプションを使用して Ansible 出力の詳細度を上げ、タスク実行に関するより詳細な情報を取得します。
  2. タスクの出力とエラーメッセージを確認し、失敗の根本原因に関する手がかりを探します。
  3. 管理対象ノードのシステムログを確認し、関連するエラーメッセージや情報を探します。

特定のエラータイプの対処

「失敗 (Failed)」エラーのタイプに応じて、問題をトラブルシューティングして解決するために異なるアクションを取る必要がある場合があります。いくつかの一般的なエラータイプとそのトラブルシューティング手順は以下の通りです。

  1. モジュール実行エラー: モジュールが管理対象ノードに正しくインストールされ、構成されていることを確認します。
  2. コマンド実行エラー: コマンドが有効であり、管理対象ノードがそれを実行するための必要な権限を持っていることを確認します。
  3. リソース変更エラー: タスクが予期される方法でリソースを変更しようとしており、管理対象ノードがその変更を実行するための必要な権限を持っていることを確認します。

これらの手順に従うことで、Ansible の「失敗 (Failed)」エラーを効果的にトラブルシューティングして解決することができます。

まとめ

この Ansible チュートリアルの終わりまでに、Ansible Playbook での「到達不能 (unreachable)」および「失敗 (failed)」エラーを効果的にデバッグする方法をしっかりと理解することができるでしょう。Ansible の組み込みデバッグツールを活用し、これらの問題の根本原因を特定し、それらを防止および解決するための戦略を実装する方法を学び、Ansible を駆使したインフラ自動化がスムーズに動作することを保証します。