关于在Ansible中首次连接到Linux的问题
1. 第一次连接到Linux的Ansible接口
当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.
root@192.168.1.150'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”: “连接失败~但是已成功获取到known_host。请检查~/.ssh/kwonw_hosts文件。
3. 获取known_host的便捷方法
如果有多个初次连接的Linux服务器,为每个服务器获取主机密钥是一项繁琐的工作。
虽然希望通过Ansible自动化服务器构建和配置来实现减少工作量,但是获取100个新的Linux服务器的主机密钥会非常繁琐。
因此,可以通过指定以下环境变量来一次性获取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配置文件中将 host_key_checkin=false 进行设置,但是如果忘记恢复ansible.cfg的设置,将会导致无条件接受known_host,无法检测到连接目标的重建或转移到其他主机的情况。因此,个人不太建议这种做法。
此外,每次添加服务器都需要编辑ansible.cfg文件,这增加了设置错误的可能性,所以我认为最好尽量避免修改ansible.cfg。