[Ansible]SSHがUNREACHABLEになるときの対処方法

Ansibleを使っていて、SSH接続がUNREACHABLEになる場合の対処方法について説明します。

事象について

ここで説明する事象は以下のようなものです。

$ ansible all -m ping
server1 | UNREACHABLE! => {
    "changed": false,
    "msg": "Failed to connect to the host via ssh: Warning: Permanently added 'server1,192.168.1.1' (ECDSA) to the list of known hosts.\r\nansible@server1: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).",
    "unreachable": true
}

疎通確認のためにpingを実行してみると、対象サーバーに到達できない(UNREACHABLE)というエラーが返ってきます。

ちなみに、sshコマンドを使って接続してみると、エラーなく接続できますし、

$ ssh ansible@server1
ansible@server1's password: 
[ansible@server1 ~]$

pingコマンドも通ります。

$ ping server1
PING server1 (192.168.1.1) 56(84) bytes of data.
64 bytes from server1 (192.168.1.1): icmp_seq=1 ttl=64 time=0.141 ms
64 bytes from server1 (192.168.1.1): icmp_seq=2 ttl=64 time=0.617 ms
64 bytes from server1 (192.168.1.1): icmp_seq=3 ttl=64 time=0.429 ms
^C
--- server1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2039ms
rtt min/avg/max/mdev = 0.141/0.395/0.617/0.195 ms

原因と対処方法

Ansibleでは、pingを実行する前にSSH接続しているのですが、このとき特にオプション指定をしなければ、公開鍵認証になります。

前述でSSH接続にはパスワード認証を行っていたので、これが接続できない原因となります。対処方法は単純で、パスワード認証でSSH接続するようにします。

具体的な手順

まずは、sshpassパッケージをインストールします。Ubuntuの場合、以下のようにしてパッケージをインストールしてください。

$ apt-get install sshpass
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following NEW packages will be installed:
  sshpass
0 upgraded, 1 newly installed, 0 to remove and 122 not upgraded.
Need to get 10.3 kB of archives.
After this operation, 29.7 kB of additional disk space will be used.
Get:1 http://ports.ubuntu.com/ubuntu-ports focal/universe arm64 sshpass arm64 1.06-1 [10.3 kB]
Fetched 10.3 kB in 1s (12.5 kB/s) 
debconf: delaying package configuration, since apt-utils is not installed
Selecting previously unselected package sshpass.
(Reading database ... 25842 files and directories currently installed.)
Preparing to unpack .../sshpass_1.06-1_arm64.deb ...
Unpacking sshpass (1.06-1) ...
Setting up sshpass (1.06-1) ...

もし、以下のようなエラーが発生する場合は、先にapt-get updateを実行してください。

Reading package lists... Done
Building dependency tree       
Reading state information... Done
E: Unable to locate package sshpass

sshpassがインストールできたら、再度コマンドを実行しますが、実行の際に--ask-passオプションを指定します。

$ ansible --ask-pass all -m ping
SSH password: 
server1 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    },
    "changed": false,
    "ping": "pong"
}

pingが成功したことを確認できました。

毎回オプションを指定するのが面倒な場合は、ansible.cfgask_pass = Trueを書いておくことで省略できます。

[defaults]
ask_pass = True

SSH接続時に「WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!」のエラーが出るときの対処法

今までSSH接続していたサーバを再インストールしたり、IPやホスト名は同じですが別のサーバが導入した場合にSSH接続しようとすると、「WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!」というエラー(警告)が出て接続できない場合があります。

$ ssh 192.168.0.16
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ED25519 key sent by the remote host is
SHA256:FNjxRHnzRjm709c/sch7pZ9SuPjj0S6lp8ZrY+0scks.
Please contact your system administrator.
Add correct host key in /Users/t0k0sh1/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in /Users/t0k0sh1/.ssh/known_hosts:6
Host key for 192.168.0.16 has changed and you have requested strict checking.
Host key verification failed.

過去に接続していたサーバーを再インストールしたため、リモートホスト鍵が変わっており中間者攻撃(Man In The Middle Attack)を疑われています。

known_hostsからホスト鍵を削除する

もちろん、悪意のあるサーバーに接続していないことが確認されていることが前提となりますが、known_hostsから以前登録していたホスト鍵を削除することでこの問題を解消できます。

$ ssh-keygen -R 192.168.0.16
# Host 192.168.0.16 found: line 4
# Host 192.168.0.16 found: line 5
# Host 192.168.0.16 found: line 6
/Users/t0k0sh1/.ssh/known_hosts updated.
Original contents retained as /Users/t0k0sh1/.ssh/known_hosts.old

ssh-keygen -Rコマンドで接続先のサーバーを指定するとknown_hostsからホスト鍵を削除できます。

再度接続を試みと、初回接続時と同じように接続するかの確認が行われます。

$ ssh 192.168.0.16
The authenticity of host '192.168.0.16 (192.168.0.16)' can't be established.
ED25519 key fingerprint is SHA256:FNjxRHnzRjm709c/sch7pZ9SuPjj0S6lp8ZrY+0scks.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.0.16' (ED25519) to the list of known hosts.
t0k0sh1@192.168.0.16's password:
Welcome to Ubuntu 22.04 LTS (GNU/Linux 5.15.0-27-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  System information as of Tue Apr 26 11:20:18 PM UTC 2022

  System load:  0.080078125       Temperature:             39.0 C
  Usage of /:   6.7% of 97.87GB   Processes:               143
  Memory usage: 1%                Users logged in:         1
  Swap usage:   0%                IPv4 address for wlp1s0: 192.168.0.16


1 update can be applied immediately.
To see these additional updates run: apt list --upgradable


Last login: Tue Apr 26 23:03:25 2022
t0k0sh1@192.168.0.16:~$

依然と同じホスト鍵を使用している場合はこの問題は起きませんが、そうでない場合は、

  • サーバーを再インストールした
  • 別のサーバーだが同じIPアドレスやホスト名のサーバを立てた
  • ホスト鍵を変更した

といったときに発生します。

モバイルバージョンを終了