エラー内容
fatal: [remote-host]: FAILED! => {"changed": false, "cmd": "/usr/bin/git clone ...", "msg": "Host key verification failed.\r\nfatal: Could not read from remote repository."}
このエラーは、Ansible の git モジュールが SSH 経由(git@github.com:... または ssh://...)でクローンしようとした際に、リモートサーバーのホストキーが ~/.ssh/known_hosts に登録されていない場合に発生します。具体的には、コントロールノードではなく、ターゲットマシン上でタスクを実行しているユーザーの known_hosts が確認されます。
SSH は未知のホストへの接続をブロックします。Ansible は非対話型で実行されるため、キーを承認するプロンプトが表示されず、そのまま失敗します。
発生原因
多くの人はコントロールノード側に問題があると思いがちですが、そうではありません。known_hosts のチェックはリモートホスト(設定対象のマシン)側で行われます。そのサーバーはこれまで一度も Git サーバーに SSH 接続したことがないため、ホストキーの記録が存在しないのです。
以下の4つのシナリオで一貫して発生します:
- サーバーの新規プロビジョニング — 初めてのクローン実行時
- HTTPS から SSH クローン URL への切り替え時
- Git サーバーの IP またはキーが変更された場合(GitHub は2023年3月に RSA キーをローテーション)
deployなど、まだknown_hostsを持っていない別ユーザーでタスクを実行する場合
修正方法1:ssh-keyscan で known_hosts を事前登録する(推奨)
git タスクの前に、ホストキーをスキャンして登録するタスクを追加します:
- name: Add GitHub to known_hosts
ansible.builtin.known_hosts:
name: github.com
key: "{{ lookup('pipe', 'ssh-keyscan github.com') }}"
state: present
- name: Clone repository
ansible.builtin.git:
repo: git@github.com:yourorg/yourrepo.git
dest: /opt/app
version: main
GitLab やプライベートサーバーの場合は、github.com を対象ホストに置き換えます:
- name: Add GitLab to known_hosts
ansible.builtin.known_hosts:
name: gitlab.example.com
key: "{{ lookup('pipe', 'ssh-keyscan gitlab.example.com') }}"
path: /home/deploy/.ssh/known_hosts
state: present
path パラメーターは見落とされがちです。省略すると Ansible はデフォルトで /etc/ssh/ssh_known_hosts を使用します。しかし git タスクが deploy ユーザーとして実行される場合、そのユーザーの SSH クライアントは /home/deploy/.ssh/known_hosts を参照します。クローンを実行するユーザーに合わせて、必ず path を明示的に指定してください。
修正方法2:accept_hostkey を使う(簡易だが非推奨)
旧バージョンの Ansible では、git モジュールに accept_hostkey パラメーターが直接存在していました:
- name: Clone repository
ansible.builtin.git:
repo: git@github.com:yourorg/yourrepo.git
dest: /opt/app
version: main
accept_hostkey: yes # Ansible 2.12以降で非推奨
Ansible 2.12 でこのパラメーターは削除されました。すでに [DEPRECATION WARNING]: The 'accept_hostkey' argument is deprecated が表示されている場合は、今すぐ修正方法1に移行してください — 将来のリリースで完全に動作しなくなります。
修正方法3:既知のホストキーをハードコードする
タスク実行時に ssh-keyscan を使用するとリアルタイムのネットワーク呼び出しが発生します。特定のキーを固定したい場合や、環境がポート22での外向き SSH をブロックしている場合は、コントロールノードで一度キーを取得しておきます:
# コントロールノード上で実行:
ssh-keyscan github.com 2>/dev/null
出力をコピーして、プレイブックに直接埋め込みます:
- name: Add GitHub host key
ansible.builtin.known_hosts:
name: github.com
key: "github.com ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOMqqnkVzrm0SdG6UOoqKLsabgH5C9okWi0dh2l9GkZH"
state: present
GitHub は公式の SSH キーフィンガープリントをドキュメントページで公開しています — 本番環境にキーを固定する前に、必ずそちらで確認してください。
修正方法4:リモートホストの SSH 設定を変更する(最終手段)
リモートマシンを管理しており、すぐにブロックを解除する必要がある場合は、SSH 設定でストリクトホストチェックを無効化できます:
- name: Disable StrictHostKeyChecking for git server
ansible.builtin.blockinfile:
path: /home/deploy/.ssh/config
create: yes
mode: '0600'
owner: deploy
block: |
Host github.com
StrictHostKeyChecking no
UserKnownHostsFile /dev/null
この設定は内部ネットワークや隔離された CI 環境に限定してください。StrictHostKeyChecking no は MITM 攻撃者のキーを含む、あらゆるホストキーを無条件に受け入れます。本番環境では使用しないでください。
修正の確認
リモートホストに SSH でログインし、キーが登録されたことを確認します:
# システム全体の known_hosts を確認
grep github.com /etc/ssh/ssh_known_hosts
# またはユーザーレベルで確認
grep github.com ~/.ssh/known_hosts
# SSH 接続を直接テスト
ssh -T git@github.com
# 期待される出力: Hi username! You've successfully authenticated...
プレイブックを再実行してください。git タスクがホストキーエラーなく完了するはずです。
補足情報
- known_hosts のパス不一致:パスの指定は非常に重要です。root として実行するタスクは
/root/.ssh/known_hostsまたは/etc/ssh/ssh_known_hostsにキーが必要です。deployとして実行するタスクは/home/deploy/.ssh/known_hostsにキーが必要です。known_hostsタスクでは必ずpathを明示的に指定し、Ansible に推測させないようにしてください。 - GitHub の2023年 RSA キーローテーション:GitHub は2023年3月に RSA ホストキーを更新しました。それ以前にハードコードされた RSA キーは失敗します。ED25519 キーに切り替えてください — こちらは変更されておらず、セキュリティ面でも優れています。
- 複数の Git サーバー:すべての
known_hostsタスクを共有ロールまたはpre_tasksブロックにまとめておきましょう。すべてのgit cloneが実行される前に、すべてのホストが準備された状態になります。 - CI/CD パイプライン:GitHub Actions や GitLab CI が Ansible プレイブックを実行する場合、ランナーでも同じ問題が発生します。Ansible を呼び出す前に、パイプラインのセットアップ手順に
ssh-keyscanステップを追加してください。 - 非標準ポートのプライベートサーバー:
ssh-keyscan -p 2222 git.example.comを使用し、known_hostsタスクではname: "[git.example.com]:2222"と設定してください — ブラケット記法が必須です。

