AnsibleでのLinux への初回の接続について


1.AnsibleでのLinuxへの初回の接続

AnsibleはLinuxに対してSSHを使用して接続します。
TelaTerm等でSSHを使ってLinuxに初めて接続するとき、known_hostの保存を要求されます。
AnsibleもSSHを使用しているため、同じように初回のLinux接続時にknown_hostの保存を要求されます。

Ansibleで設定処理の時に新規サーバに対してknown_hostsを取得すればよいのですが、
初回の接続を先に済ませておき、設定作業をするサーバは接続先に間違いがないことを確認しておいたほうが
設定先の間違いがないといった自動化作業の信頼性向上のためにも良いと思います。

例えば、以下の判断材料になります。

  • know_hostsの受け入れが確認されたら接続先の設定が間違っていると無条件に判断できる。
  • サーバーの再インストールなどがされ、hostkeyが変わってしまった。  (このまま自動設定の対象にしてよいか確認が必要となる場合がある)

2.個別のLinuxのknown_host取得方法

  SSH接続初回

  • sshコマンドで事前にLinuxに接続する。
    下記ようにSSHコマンドでLinuxに接続し、known_hostを取得します。
[root@ansible ~]# ssh ホスト名
The authenticity of host 'ホスト名 (IPアドレス)' can't be established.
ECDSA key fingerprint is SHA256:9Slq4b+8j/2GARik07fPMb9mXqV7A+Z86tVO++wX3vw.
ECDSA key fingerprint is MD5:15:60:7c:73:66:4a:16:fc:a9:90:bb:c9:3e:ba:c9:70.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.1.150' (ECDSA) to the list of known hosts.
[email protected]'s password: 
Last login: Sat Mar 21 21:42:17 2020
  • Ansibleコマンドで接続して取得する。
    • ansible ホスト名 -m ping -i konon_host取得用インベントリファイル
[root@ansible2 ansible]# ansible ホスト名 -m ping -i インベントリファイル名 
The authenticity of host 'ホスト名 (IPアドレス)' can't be established.
ECDSA key fingerprint is SHA256:9Slq4b+8j/2GARik07fPMb9mXqV7A+Z86tVO++wX3vw.
ECDSA key fingerprint is MD5:15:60:7c:73:66:4a:16:fc:a9:90:bb:c9:3e:ba:c9:70.
Are you sure you want to continue connecting (yes/no)? yes
IPアドレス | UNREACHABLE! => {
    "changed": false, 
    "msg": "Failed to connect to the host via ssh: Warning: Permanently added 'IPアドレス' (ECDSA) to the list of known hosts.\r\nPermission denied (publickey,gssapi-keyex,gssapi-with-mic,password).", 
    "unreachable": true
}

※"msg": "Failed to connect to ~ とエラーが出ていますが、問題なくknown_hostが取得できています。~/.ssh/kwonw_hostsを確認してください。

3.一括でknown_hostを取得する便利な方法

初めて接続するLinuxが複数あった場合、1つ1つのサーバに対してhostkeyを取得するのは手間がかかる作業です。
Ansibleでサーバ構築、設定の自動化により省力化を行いたいのに、100台の新規Linuxサーバのhostkey取得作業を
行うと大変手間がかかります。
そこで、以下のように環境変数を指定することで一気にknown_hostを取得して省力化が図れます。

  • 環境変数 ANSIBLE_HOST_KEY_CHECKING に、値 false を設定する。
  • ansible コマンドでpingを実行する。この時、known_hostを取得する対象を定義した専用のインベントリファイルを作成し、すべてのインベントリファイルを取得する。
  • 環境変数 ANSIBLE_HOST_KEY_CHECKING を削除する。
[root@ansible ansible]# export ANSIBLE_HOST_KEY_CHECKING=false
[root@ansible ansible]# ansible ALL -m ping -i host_first
IPアドレス | UNREACHABLE! => {
    "changed": false, 
    "msg": "Failed to connect to the host via ssh: Warning: Permanently added 'IPアドレス' (ECDSA) to the list of known hosts.\r\nPermission denied (publickey,gssapi-keyex,gssapi-with-mic,password).", 
    "unreachable": true
}
・
・
・
[root@ansible ansible]# unset ANSIBLE_HOST_KEY_CHECKING

※ANSIBLE_HOST_KEY_CHECKING=false により、ansibleコマンドがユーザーの確認要求なしにhost_keyを受け入れます。
 (~|/.ssh/known_hostsにキーが追加されます)
※ansible.cfgというansibleの環境設定ファイルで host_key_checkin = false と設定する方法をとっている方も
 おられますが、ansible.cfgの設定を戻し忘れると以降も無条件にknown_hostを受け入れ、接続対象が
 再構築されたり別のホストに転用された場合に検知できなくなるため、個人的にはあまりお勧めしません。
 また、サーバー追加のたびにansible.cfgを編集するとことになりますので、設定ミスの可能性を
 増やすことにもなりますので、ansible.cfgの変更はなるべく避けたほうが良いと思います。