AnsibleのgitモジュールでSSHクローン時に発生する「Host key verification failed」を修正する

intermediate🔧 Ansible2026-06-19| Ansible 2.9以降、Ubuntu 20.04/22.04、Debian、RHEL/CentOS — GitHub、GitLab、Bitbucket、またはプライベートGitサーバーへSSH経由でクローンするリモートホスト

Error Message

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#clone

エラー内容

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" と設定してください — ブラケット記法が必須です。

Related Error Notes