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

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
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次