Ansible の一般的なエラー: プレイブック実行の失敗のトラブルシューティング
Ansible プレイブックのよくある失敗をトラブルシューティングします。接続、モジュール、YAML、変数、ロール、Vault のエラーを含みます。
Ansible よくあるエラー: プレイブック実行失敗のトラブルシューティング
Ansible のよくあるエラーは、たいてい最悪のタイミングで発生します。ロールアウトの途中でプレイブックが失敗したり、ホストに到達できなくなったり、変数が空白で表示されたりします。最速の修正方法は、失敗メッセージを読み、適切なカテゴリに分類することから始まります。
このガイドでは、推測に頼らずにプレイブックの実行失敗をトラブルシューティングする方法を説明します。よくある症状、考えられる原因、そして最初に実行すべき実用的なチェック項目を紹介します。
Ansible エラーメッセージの理解
Ansible は通常、失敗したレイヤーを見つけるのに十分な情報を提供します。以下の点に注目してください:
- タスク名: 失敗したタスク。
- 使用されたモジュール: エラーを生成したモジュールまたはアクション。
- リターンコードまたはステータス: システムのリターンコード、HTTP ステータス、またはモジュール固有のステータス。
- エラーメッセージ:
msg、stderr、またはexceptionの後のテキスト。 - 行番号: 利用可能な場合のプレイブックまたはロールファイルの場所。
stderr と stdout に特に注意してください。たとえば、Ansible タスクが汎用的なモジュールメッセージで失敗しても、stderr には Permission denied や No such file or directory と表示されることがあります。
よくあるエラーカテゴリと解決策
1. 接続および認証エラー
これらのエラーは、Ansible がターゲットホストへの接続を確立できないか、正常に認証できない場合に発生します。
症状:
Failed to connect to host [...]Permission denied [...]Authentication failed for user [...]
原因と解決策:
- SSH または WinRM の資格情報が正しくない: SSH の場合は、秘密鍵がコントロールノードで利用可能であり、公開鍵がターゲットで認証されていることを確認してください。Windows の場合は、WinRM の構成、ユーザー名、パスワード、および権限を確認してください。
# 例: プレイブックでユーザーと鍵ファイルを指定する - name: Configure web server hosts: webservers become: yes vars: ansible_user: ubuntu ansible_ssh_private_key_file: /path/to/your/private_key.pem tasks: - name: Install Nginx apt: name: nginx state: present - ファイアウォールの問題: Ansible コントロールノードから SSH または WinRM に到達可能であることを確認してください。
- インベントリホストの誤り: ホスト名または IP アドレスがコントロールノードから解決可能であることを確認してください。
- SSH エージェントキーの欠落:
ssh-agentに依存している場合は、プレイブックを実行する前にキーがロードされていることを確認してください。
2. モジュールエラーと設定ミス
これらのエラーは、モジュールの誤った使用、パラメータの欠落、またはターゲットシステム上の互換性のない設定に起因します。
症状:
Invalid parameter [...] for module [...]Failed to set parameter [...]- モジュール固有のエラー(
Error installing packageやFailed to create directoryなど)
原因と解決策:
- モジュールパラメータが正しくない: モジュールのドキュメントを確認し、必要な値とデータ型を確認してください。たとえば、
copyモジュールにはコントロールノード上のソースとターゲットホスト上の宛先が必要です。- name: Copy configuration file copy: src: /etc/ansible/files/my_app.conf dest: /etc/my_app.conf owner: root group: root mode: '0644' - 依存関係の欠落: パッケージモジュールには動作するリポジトリが必要です。クラウドモジュールやネットワークモジュールには、コントロールノードに Python ライブラリやコレクションが必要な場合があります。
- 冪等性の問題: カスタムコマンドは、実行のたびに変更や失敗を報告する可能性があります。デフォルトの結果が実際と一致しない場合は、
changed_whenとfailed_whenを使用してください。 - 権限が不十分: タスクに昇格された権限が必要な場合は
become: yesを追加し、リモートユーザーが sudo を使用できることを確認してください。
3. 構文エラーとプレイブックの構造
YAML 構文またはプレイブックの全体的な構造のエラーにより、実行が妨げられる可能性があります。
症状:
Syntax Error while loading YAML [...]ERROR! unexpected indentation in [...]ERROR! couldn't resolve module/action [...]
原因と解決策:
- YAML のインデント: タブではなくスペースを使用してください。実際の実行前に
ansible-playbook --syntax-check your_playbook.ymlを実行してください。 - タイプミスとコロンの欠落: コロンや引用符が欠落していると、プレイブック全体が壊れる可能性があります。
- モジュール名が正しくない: 必要に応じて、
ansible.builtin.copyやcommunity.general.ufwのように完全修飾コレクション名を使用してください。 - 無効な Jinja2 構文: テンプレート内の不正なフィルター、中括弧の欠落、未定義の変数により、ホストに到達する前にタスクが停止する可能性があります。
4. 変数とデータの問題
変数が正しく定義されていないか使用されていないと、予期しない動作やタスクの失敗につながる可能性があります。
症状:
Variable not defined [...]Template error [...]- 予期しない値でタスクが失敗する
原因と解決策:
- 未定義の変数: インベントリファイル、
vars、vars_files、include_vars、ロールのデフォルト、グループ変数を確認してください。debugを使用して、Ansible が認識している値を確認してください。- name: Debug variable value debug: var: my_application_version - 変数の優先順位: 追加の vars の値が
group_varsの値を上書きする場合があります。最終的な値の出所を追跡してください。 - データ型が正しくない: 必要に応じて、数値のモジュールパラメータには
{{ my_var | int }}のように値をキャストしてください。
5. ロール実行エラー
Ansible ロールを使用する際に、特に変数のスコープ、ハンドラー、依存関係に関連して問題が発生する可能性があります。
症状:
- ロール内のタスクが実行されない。
- ロール内の変数が予期しない値を持つ。
- ハンドラーがトリガーされない。
原因と解決策:
- ロールの組み込みが正しくない: ロールが
roles:の下にリストされているか、正しいパスでインポートされていることを確認してください。 - 変数のスコープ: デフォルトは
defaults/main.ymlに、ロール固有の変数はvars/main.ymlに、環境のオーバーライドはインベントリに配置してください。 - ハンドラーの問題: ハンドラーは、タスクが
changedを報告し、notifyを使用した場合にのみ実行されます。- name: Configure Nginx template: src: nginx.conf.j2 dest: /etc/nginx/nginx.conf notify: Restart Nginx handlers: - name: Restart Nginx service: name: nginx state: restarted - ロールの依存関係: ロールが別のロールに依存している場合は、
meta/main.ymlを確認し、依存関係がインストールされていることを確認してください。
6. Ansible Vault エラー
Ansible Vault の問題は、多くの場合、暗号化/復号化の失敗または誤った Vault パスワードの処理に関連しています。
症状:
Decryption failed [...]Encrypted data contains invalid characters.
原因と解決策:
- Vault パスワードが正しくない: 正しいパスワードプロンプトまたはパスワードファイルを使用してください。
ansible-playbook -i inventory.ini --ask-vault-pass my_playbook.yml - 暗号化が正しくない: ファイルが
ansible-vault encryptで暗号化されているか、ansible-vault editで編集されていることを確認してください。 - パスワードファイルの権限が緩い: Vault パスワードファイルへのアクセスを制限してください。
トラブルシューティングのベストプラクティス
- 通常の出力が不十分な場合は、
-vvvを指定して実行してください。 - 実際の実行前に
ansible-playbook --syntax-checkを使用してください。 - モジュールがサポートしている場合は、
--checkモードを使用してください。 - すべてを組み合わせる前に、1 つのロールまたはタスクグループをテストしてください。
- プレイブック、インベントリ、ロールの変更をバージョン管理に保存してください。
- CI ログを保存して、失敗した実行と正常な実行を比較できるようにしてください。
専門家に相談すべき場合
プレイブックが本番ネットワークを変更する、シークレットをローテーションする、多数のホストを一度に変更する、またはデプロイメントの途中で失敗する場合は、シニアプラットフォームエンジニアの助けを求めてください。失敗モードを理解するまでは、破壊的なタスクを再実行し続けないでください。
まとめ
Ansible のトラブルシューティングは、失敗したタスク、モジュールの出力、インベントリターゲットから始めてください。次に、問題を接続、モジュールの使用、YAML 構文、変数、ロール、または Vault に絞り込みます。このプロセスにより、実際のエラーがすでに出力に表示されているにもかかわらず、自動化の無関係な部分を変更することを防げます。