TL;DR: クイック修正
すぐに作業を再開する必要があり、セキュリティ上のトレードオフを理解している場合(ローカルのラボや開発環境で一般的)、次のコマンドを実行して古いホストキーを削除してください:
ssh-keygen -R <your_server_ip_or_hostname>
または、ansible.cfgに以下を追加することで、Ansibleのグローバルなキーチェックを停止することもできます:
[defaults]
host_key_checking = False
警告の内容を理解する
プレイブックを実行すると、すべてが停止します。赤いテキストのブロックでリモートホストの識別情報が変更されたという警告が表示されます。これはAnsibleのバグではなく、SSHの基本的なセキュリティメカニズムです。
SSHは「フィンガープリント(指紋)」を使用してサーバーの身元を確認します。最初の接続時に、このフィンガープリントは ~/.ssh/known_hosts に保存されます。後にOSを再インストールしたり、クラウドプロバイダーがリサイクルされたIPを新しいインスタンスに割り当てたりすると、フィンガープリントが変更されます。SSHはこの不一致を検出し、中間者攻撃(MITM)を防ぐために接続を強制終了します。
解決策1:古いキーの削除(最も安全)
これはピンポイントなアプローチです。警戒レベルを下げる代わりに、特定の一つのIPまたはホスト名に対する古いフィンガープリントを忘れるようマシンに指示します。
# 192.168.1.100 を対象サーバーのIPに置き換えてください
ssh-keygen -R 192.168.1.100
次回Ansibleを実行すると、サーバーを新しい接続として扱います。一度手動でSSH接続して「yes」を入力し新しいキーを承認するか、以下の自動化手法を使用する必要があります。
解決策2:動的スケーリングのためのチェック回避
1台や2台のサーバーであれば手動でのキー削除で問題ありません。しかし、1日に50台の使い捨てのAWS EC2インスタンスを起動するような場合、それは不可能なボトルネックになります。この回避策を自動化できます。
オプションA:プロジェクトレベルの設定(推奨)
プロジェクトのルートディレクトリに ansible.cfg ファイルを作成します。これにより、設定がプロジェクト内に留まり、システム全体に影響を与えないようになります。
[defaults]
host_key_checking = False
オプションB:環境変数を使用する
ファイルを編集せずに一度だけ修正したいですか?ターミナルセッションで直接変数を設定してください:
export ANSIBLE_HOST_KEY_CHECKING=False
ansible-playbook deploy.yml
オプションC:詳細なSSHカスタマイズ
より詳細な制御が必要な場合は、基盤となるSSHプロセスに直接引数を渡します。この設定により、Ansibleが known_hosts ファイルに何も書き込まないようにします:
[ssh_connection]
ssh_args = -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null
解決策3:自己修復プレイブック
自動化ロジック内で動的にキーを処理できます。known_hosts モジュールを使用して、残りのタスクを実行する前に新しいキーを取得し承認します。
- name: 新しいSSHフィンガープリントを自動承認する
hosts: localhost
tasks:
- name: known_hostsをスキャンして更新する
known_hosts:
name: "{{ target_ip }}"
key: "{{ lookup('pipe', 'ssh-keyscan -t rsa ' + target_ip) }}"
state: present
修正の確認
ping モジュールを使用して接続をテストします。修正が成功すれば、手動の確認を求められることなく、鮮やかな緑色の「pong」が返されます。
ansible all -m ping -i inventory.ini
それでも失敗する場合は、重複エントリを確認してください。まれに known_hosts にホスト名とIPアドレスの両方のエントリが個別に含まれていることがあります。その場合、両方に対して ssh-keygen -R を実行する必要があります。
最終的なセキュリティ上の注意
- 文脈が重要: ホストキーチェックの無効化は、CI/CDパイプラインや内部VPCでは標準的な慣行です。これにより、トラブルシューティングの時間を大幅に節約できます。
- 公開ネットワークのリスク: 公開インターネット経由でアクセスする本番サーバーでは、この設定を無効にしないでください。キーの検証がないと、悪意のあるゲートウェイによってデータが傍受されていないことを保証する方法がありません。
- 高度なセキュリティチューニングについては、Ansible公式ドキュメントを参照してください。

