Failed to connect to the host via ssh: Permission denied (publickey)
Ansibleやってる人はこんなエラーを見たことがあるだろうか。久しぶりにハマったのでブログしたいと思う。ハマったというかopensshの仕様を忘れていた件。。。
■具体的なエラー
もちろんDry runやっても同じエラー。
1 2 3 4 5 6 7 8 9 10 11 |
ansible@humidai $ ansible -i hosts -u ec2-user all -m ping 10.0.0.xxx | UNREACHABLE! => { "changed": false, "msg": "Failed to connect to the host via ssh: Permission denied (publickey).\r\n", "unreachable": true } 10.0.0.xxx | UNREACHABLE! => { "changed": false, "msg": "Failed to connect to the host via ssh: Permission denied (publickey).\r\n", "unreachable": true } |
■環境
- 踏み台から各サーバにansibleでssh(AWS)
- 踏み台からconfigを使ってsshは繋がる(ansibleユーザからec2-userで)
- ansibleのバージョン:2.2.1.0
・ちなみにconfigはこんな感じ
1 2 3 4 5 6 7 8 9 10 11 12 |
$ more config Host web01 Hostname 10.0.0.xxx Port 22 User ec2-user IdentityFile ~/.ssh/web Host web02 Hostname 10.0.0.xxx Port 22 User ec2-user IdentityFile ~/.ssh/web |
■原因を調べてみた
そもそも踏み台からsshできるのに何故!?とりあえず-vvvvでどんなことが起きてるのか出力されるのでやってみた。
1 2 3 4 5 6 7 8 9 |
ansible@humidai$ ansible -i hosts -u ec2-user all -m ping -vvvv ~省略~ Trying private key: /home/ansible/.ssh/id_dsa\r\ndebug3: no such identity: /home/ansible/.ssh/id_dsa: No such file or directory \r\ndebug1: Trying private key: /home/ansible/.ssh/id_ecdsa\r\ndebug3: no such identity: /home/ansible/.ssh/id_ecdsa: No such file or directory\r\ndebug1: Trying private key: /home/ansible/.ssh/id_ed25519\r\ndebug3: no such identity: /home/ansible/.ssh/id_ed25519: No such file or directory\r\ndebug2: we did not send a packet, disable method\r\ndebug1: No more authentication methods to try.\r\nPermission denied (publickey).\r\n", "unreachable": true } |
デフォルトでid_rsaを見に行くのは必然的にopensshの仕様だった。。
■解決
つまりAnsible初回時の設定としては以下の2ついずれかがマッチしていればOK
- ~/.ssh/configにHost、HostNameを書いて名前解決をしてsshできるようにする
- ansible.cfgで名前解決をする
1 2 3 4 5 6 7 8 9 |
ansible@humidai$ ansible -i hosts -u ec2-user all -m ping 10.0.0.xxx | SUCCESS => { "changed": false, "ping": "pong" } 10.0.0.xxx | SUCCESS => { "changed": false, "ping": "pong" } |
■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/
0件のコメント