AnsibleのSSHエラー「REMOTE HOST IDENTIFICATION HAS CHANGED」の修正方法

beginner🔧 Ansible2026-05-24| Ansible 2.9+, Linux (Ubuntu/CentOS/Debian), macOS, SSHベースの接続

Error Message

WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
#ansible#ssh#known_hosts#devops#security

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公式ドキュメントを参照してください。

Related Error Notes