Failed to connect to the host via ssh: Permission denied (publickey)

ansibleやってる人はこんなエラーを見たことがあるだろうか。
久しぶりにハマったのでブログしたいと思う。
ハマったというかopensshの仕様を忘れていた件。。。


■具体的なエラー

もちろんDry runやっても同じエラー。


■環境

  1. 踏み台から各サーバにansibleでssh(AWS)
  2. 踏み台からconfigを使ってsshは繋がる(ansibleユーザからec2-userで)
  3. ansibleのバージョン:2.2.1.0

・ちなみにconfigはこんな感じ


■原因を調べてみた

そもそも踏み台からsshできるのに何故!?
とりあえず-vvvvでどんなことが起きてるのか出力されるのでやってみた。

むむむ。そうか!ワロス。
デフォルトでid_rsaを見に行くのは必然的にopensshの仕様だった。。


■解決

つまりansible初回時の設定としては以下の2ついずれかがマッチしていればOK

  1. ~/.ssh/configにHost、HostNameを書いて名前解決をしてsshできるようにする
  2. ansible.cfgで名前解決をする


■ssh(1) – Linux man page

https://linux.die.net/man/1/ssh

デフォルトの鍵がid_rsaであることのソースは以下。

-i identity_file
Selects a file from which the identity (private key) for RSA or DSA authentication is read.
The default is ~/.ssh/identity for protocol version 1, and ~/.ssh/id_rsa and ~/.ssh/id_dsa for protocol version 2.
Identity files may also be specified on a per-host basis in the configuration file.
It is possible to have multiple -i options (and multiple identities specified in configuration files).

(訳)
RSAまたはDSA認証のID(秘密鍵)が読み取られるファイルを選択します。
デフォルトはプロトコルバージョン1の場合は~/.ssh/identity、プロトコルバージョン2の場合は~/.ssh/ id_rsa、~/.ssh /id_dsaです。
アイデンティティファイルは設定ファイル内のホスト単位で指定することもできます。
複数の-iオプション(および設定ファイルで指定された複数のアイデンティティ)を持つことは可能です。


■まとめ

自分の思い違いはコワイ。

参考
http://dev.classmethod.jp/server-side/ansible/enable_ssh_conf_using_via_ansible-cnf/

The following two tabs change content below.

あだちん

1989年生まれ。 ランサーズ/SRE。 ホスティングから大規模なアドテクなどのインフラエンジニアとして携わり、ランサーズにてサーバ系のお仕事も副業で行い、他社インフラレスポンス改善、ansibleでのインフラコード化を推進し、未経験によるエンジニア勉強会なども実施している。 そして「脆弱性スキャナVuls」のOSS活動もしており、自称エバンジェリスト/広報/VulsRepo init file,chatwork通知のコントリビュータでもある。 現在はDocker開発環境の提供,AWSで新サービスのインフラ構築,PHPバージョンアップ,分析基盤を担当しておりDigdag,embulk,BigQueryを使いこなそうと奮闘中。

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください