当使用 Ansible 时,在连接到未在 known_hosts 中的网络设备时出现错误的处理方法(使用持久连接)
■ 1. 关于持久连接
在Ansible 2.3中,新增了一个名为”persistent connections”的功能,可以重用SSH连接以对网络设备进行操作。像以前一样,在Playbook中将connection设置为local,就可以使用persistent connections功能。
-
- 参考:
インフラ自動化ツール「Ansible 2.3」リリース。SSHのコネクションを使い続けるPersistent Connectionでタスク処理が高速に
Ansible ネットワークモジュールの Persistent Connections 利用方法と注意点
然而,IOS模块等一些模块是有限制的。
如果使用这些支持持久连接的模块,如果SSH登录的目标指纹不在known_hosts中,将会出现错误。本文将对解决方法进行说明。
2. 现象:出现错误
在没有-v选项的情况下运行,“无法打开shell。”
[root@localhost ~]# ansible-playbook cat.yml
PLAY [cisco] *******************************************************************************************
TASK [config] ******************************************************************************************
fatal: [192.168.1.254]: FAILED! => {"changed": false, "failed": true, "msg": "unable to open shell. Please see: https://docs.ansible.com/ansible/network_debug_troubleshooting.html#unable-to-open-shell", "rc": 255}
由于无法打开shell,可能有几个原因,仅凭此输出无法确定具体原因,因此请启用调试模式并再次尝试。
调试日志启用时,显示”(14,’坏地址’)”。
[root@localhost ~]# export ANSIBLE_LOG_PATH=~/ansible.log # ログ有効
[root@localhost ~]# export ANSIBLE_DEBUG=True # デバッグ有効
[root@localhost ~]# ansible-playbook -vvvv cat.yml # -vvvv も指定して実行(失敗)
(~省略~)ログたたくさん流れるので注意
PLAY RECAP *********************************************************************************************
192.168.1.254 : ok=0 changed=0 unreachable=0 failed=1
15047 1493490307.83398: RUNNING CLEANUP
[root@localhost ~]#
这样做的话,会在~/ansible.log文件中输出详细日志。
其中会输出一条日志为(14, ‘Bad address’)。
2017-04-30 03:26:26,071 paramiko.transport Compression agreed: none
2017-04-30 03:26:26,606 paramiko.transport kex engine KexGroup1 specified hash_algo <built-in function openssl_sha1>
2017-04-30 03:26:26,607 paramiko.transport Switch to new keys ...
2017-04-30 03:26:26,630 p=15119 u=root | connecting to host 192.168.1.13 returned an error
2017-04-30 03:26:26,630 p=15119 u=root | (14, 'Bad address')
2017-04-30 03:26:26,708 paramiko.transport EOF in transport thread
(~省略~)
2017-04-30 03:26:55,985 p=15111 u=root | fatal: [192.168.1.13]: FAILED! => {
"changed": false,
"failed": true,
"msg": "unable to open shell. Please see: https://docs.ansible.com/ansible/network_debug_troubleshooting.html#unable-to-open-shell",
"rc": 255
}
3. 处理方法
总体上有两种应对方法。
- 参考: Error: “connecting to host returned an error” or “Bad address”
【对策1】提前将 known_hosts 登录至注册
可以尝试使用您平时使用的终端或ssh命令登录目标设备,而不是通过ansible,然后将其登记到known_hosts中,这样就不会输出错误,并可以成功执行Plyabook。
【方案2】将其设定为自动将主机添加至 known_hosts 中。
有一种方法可以将asnbile做为设定,自动将其注册到known_hosts上。
如果使用环境变量进行指定,则在执行Playbook之前按照以下方式进行操作。
export ANSIBLE_PARAMIKO_HOST_KEY_AUTO_ADD=True
如果要在ansible.cfg中进行设置,请按照以下方式进行设置,然后执行Playbook。
[paramiko_connection]
host_key_auto_add = True
※截至2017/04/30,官方文档中似乎没有记录ansible.cfg中处理方法的内容,但这只是由于.rst格式的错误拼写而导致看不到。如果检查.rst文件本身,就会发现上述的处理方法已经记录在内。
■ 4. 概述
-
- Ansible 2.3 から persistent connections 機能を利用するネットワークモジュールは、接続対象のfingerprintがknown_hostsにないとエラーになる。
- あらかじめ登録しておくか、自動登録の設定をしておくことで正常に実行できるようになる。