「赤い文字」にパニックになるのは、今日で終わりにしよう。
こんにちは!「LINUX工房」管理人の「リナックス先生」です。
全8回のAnsible講座、完走おめでとうございます。
もうあなたは、Playbookを書いてサーバーを自動構築できる立派な自動化エンジニアです。
しかし、現実は甘くありません。
「昨日まで動いていたPlaybookが、今日は真っ赤なエラーを吐いて止まる」
「変数の値が思った通りに入っていなくて、設定ファイルが空っぽになる」
そんなトラブルに必ず遭遇します。
先生、助けてください!
Playbookを実行したら FAILED! って出て止まっちゃいました。
「SSH Error」とか書いてある気もするんですけど、文字がいっぱいありすぎて何が原因かわかりません!
とりあえず再実行したけど、やっぱりダメでした…。
落ち着いて、コウ君。エラーログは敵じゃないわ、Ansibleからの「手紙」よ。
そこには「何が」「どこで」「なぜ」ダメだったかが必ず書いてある。
今回は、その手紙を正しく読み解くための「デバッグ技術」と、エラーが起きても安全に停止させる「防御的な書き方」を伝授するわ。
これを知っていれば、トラブルなんて怖くない!
本記事では、AlmaLinux 9 をベースに、詳細ログオプション(-vvv)の読み方、変数を可視化する debug モジュール、前提条件をチェックする assert モジュール、そしてDockerコンテナの操作まで、実践的なテクニックを網羅します。
🚀 Ansible完全攻略講座(バックナンバー)
基礎から応用まで、ここで振り返れます。
- 【第1回】構成管理の革命児!エージェントレスで始める自動化入門&環境構築
- 【第2回】ターゲットを支配せよ。インベントリの書き方とansible.cfgの最適解
- 【第3回】Playbookの基礎。YAMLの作法と「モジュール」によるタスク定義
- 【第4回】変数を使いこなせ。Jinja2テンプレートによる設定ファイルの動的生成
- 【第5回】コードを整理整頓。Rolesディレクトリ構成と再利用性の最大化
- 【第6回】秘密情報の管理と通知。Ansible Vaultの暗号化とHandlers
- 【第7回】実践演習。LAMP環境(Apache+MySQL+PHP)をボタン一つで構築する
- 【第8回】GUIで管理。Ansible AWX(Tower)入門とCI/CDパイプラインへの統合
第1章:詳細モード「-v」で裏側を覗く
Ansibleのトラブルシューティングにおいて、最初にやるべきことは「詳細モード(Verbosity Mode)」での実行です。
オプション -v をつける数によって、表示される情報の細かさが変わります。
1. -v (レベル1: 結果の詳細)
ansible-playbook site.yml -v
タスクが失敗したとき、通常は「FAILED!」だけですが、-v をつけると「どのモジュールが」「どんな結果を返したか(標準出力など)」が表示されます。
まずはこれをつけましょう。
2. -vvv (レベル3: SSH接続のデバッグ)
ansible-playbook site.yml -vvv
通称「スリー・ブイ」。SSH接続の確立プロセスまで全て表示されます。
「Unreachable(到達不能)」エラーが出たときは、迷わずこれを使いましょう。
チェックポイント:
- どの秘密鍵を使っているか? (
IdentityFile) - どのユーザーで接続しようとしているか? (
User) - sudoパスワードは通っているか?
これらがログの中に明確に記述されています。
第2章:変数を可視化する「debug」モジュール
「テンプレートで設定ファイルを作ったけど、値が空っぽだった」「if文が意図した通りに分岐しない」。
そんな時は、変数の値が期待通りに入っていないことが多いです。
プログラミングで言う print() デバッグをするために、debug モジュールを使います。
基本の使い方
- name: Check variable value
ansible.builtin.debug:
var: http_port
# またはメッセージ付きで
# msg: "The port is {{ http_port }}"
応用:register との組み合わせ
コマンドの実行結果を変数に入れて(register)、その中身を確認するパターンは頻出です。
- name: Check Apache Status
ansible.builtin.command: systemctl status httpd
register: apache_status
ignore_errors: true # エラーでも止まらないようにする
- name: Show Status
ansible.builtin.debug:
var: apache_status.stdout_lines
stdout_lines を指定すると、改行コードで整形されたリスト形式で見やすく表示されます。
第3章:防御的Playbook「assert」モジュール
エラーが出てから慌てるのではなく、「実行前に前提条件をチェックして、ダメなら親切なメッセージを出して止める」のが、プロのPlaybookです。
これには assert モジュールを使います。
使用例1:OSバージョンのチェック
「このPlaybookはAlmaLinux 9専用です」という場合。
- name: Check OS version
ansible.builtin.assert:
that:
- ansible_distribution == "AlmaLinux"
- ansible_distribution_major_version == "9"
fail_msg: "This playbook only supports AlmaLinux 9!"
success_msg: "OS check passed."
条件(that)を満たさない場合、fail_msg を表示して即座に停止します。
謎のエラーで途中停止してサーバーを半端な状態にするより、最初に止める方が100倍マシです。
使用例2:必須変数のチェック
「パスワード変数が定義されていなかったら止める」場合。
- name: Check password variable
ansible.builtin.assert:
that:
- db_password is defined
- db_password | length > 8
fail_msg: "db_password is not defined or too short!"
第4章:エラーハンドリング(block / rescue / always)
プログラミング言語にある try - catch - finally と同じことが、Ansibleでもできます。
「処理が失敗したら、ロールバック(元に戻す)処理をする」といった高度な制御が可能です。
構文の例
- name: Dangerous Update Operation
block:
- name: Upgrade Database
ansible.builtin.shell: /usr/local/bin/upgrade_db.sh
- name: Restart Database
ansible.builtin.service:
name: mariadb
state: restarted
rescue:
- name: Revert Database (if failed)
ansible.builtin.shell: /usr/local/bin/restore_db_backup.sh
- name: Send Alert to Slack
ansible.builtin.uri:
url: https://hooks.slack.com/...
method: POST
body: '{"text": "DB Upgrade Failed! Rolled back."}'
always:
- name: Clean up temporary files
ansible.builtin.file:
path: /tmp/upgrade.log
state: absent
- block: メインの処理。ここでエラーが起きると、即座に
rescueに飛びます。 - rescue: エラーが起きた時だけ実行される処理(リカバリ、通知など)。
- always: 成功・失敗に関わらず、最後に必ず実行される処理(後始末など)。
第5章:【発展】DockerコンテナをAnsibleで操る
最近の現場では、サーバーに直接Apacheを入れるのではなく、Dockerコンテナとして立ち上げることも増えています。
Ansibleには community.docker コレクション があり、docker-compose.yml を書くのと同じ感覚でコンテナ管理ができます。
1. 準備(コレクションのインストール)
コントロールノード(実行する側)にコレクションを入れます。
ansible-galaxy collection install community.docker
2. Dockerコンテナを起動するPlaybook
Nginxのコンテナを立ち上げる例です。
- name: Start Nginx Container
hosts: docker_servers
become: true
tasks:
- name: Install Docker (if not exists)
ansible.builtin.dnf:
name: docker
state: present
- name: Ensure Docker is running
ansible.builtin.systemd:
name: docker
state: started
enabled: true
- name: Run Nginx Container
community.docker.docker_container:
name: my-nginx
image: nginx:latest
state: started
restart_policy: always
ports:
- "80:80"
volumes:
- /var/www/html:/usr/share/nginx/html:ro
docker run コマンドを叩くのと違い、「コンテナが起動している状態を保証する(冪等性)」点がメリットです。
設定変更があった場合だけコンテナを再作成(Recreate)してくれます。
第6章:よくあるエラー集(FAQ)
初心者が必ずハマるエラーと、その解決策をまとめました。
Q1. “Permission denied (publickey,gssapi-keyex,gssapi-with-mic)”
原因: SSH接続に失敗しています。
対策:
1. ssh user@host で手動ログインできるか確認。
2. 公開鍵が相手の ~/.ssh/authorized_keys にあるか確認。
3. ansible.cfg の private_key_file が正しいか確認。
Q2. “ModuleNotFoundError: No module named ‘docker'”
原因: ターゲットサーバー側のPythonに docker ライブラリが入っていません(Ansibleモジュールが依存しています)。
対策: pip install docker または dnf install python3-docker を実行するタスクを追加してください。
Q3. “sudo: a password is required”
原因: become: true を使っていますが、sudoパスワードなしで実行できる設定になっていません。
対策:
1. visudo で NOPASSWD 設定をする。
2. または、ansible-playbook -K で実行時にパスワードを入力する。
Q4. “Syntax Error while loading YAML”
原因: YAMLのインデントがずれています。全角スペースが入っているかもしれません。
対策: VS CodeのYAML拡張機能を使ってチェックしてください。コロンの後のスペース忘れもよくある原因です。
まとめ:エラーログは「成長の糧」
今回の付録では、トラブルシューティングの技術と、発展的なDocker連携について学びました。
今回の重要ポイント:
-vvvは友達。SSH接続エラーはここを見れば全部わかる。debugモジュールで変数を可視化せよ。assertで前提条件をチェックし、block/rescueで失敗に備える。- AnsibleでDockerコンテナも管理できる(インフラのモダン化)。
エラーが出ると焦ってしまいますが、Ansibleのエラーメッセージは比較的親切です。
「何が起きたか」を冷静に読み解き、一つずつ解決していくプロセスこそが、エンジニアとしてのスキルを最も高めてくれます。
これで、Ansible講座は本当の完結です。
あなたのPlaybookが、チームを助け、サービスを支える堅牢なインフラになることを願っています。
Happy Automating!
▼ トラブル対応力を実践で磨く ▼
デバッグを試す
「VPS」で自分専用環境
問題解決能力を年収に
「ITエンジニア転職」

コメント