概要 原本是ansible1.9.x的版本,后来升级了ansible的版本之后出现,failed to resolve remote temporary directory from ansible-tmp……问题。连最基本的ping模块都使用不了了。
现在使用的ansible的版本是:2.1.0
[[email protected] ~]# ansible --version ansible 2.1.0.0 config file = /etc/ansible/ansible.cfg configured module search path = Default w/o overrides
问题如下:
"msg": "failed to resolve remote temporary directory from ansible-tmp-1471585155.14-189251857196240: `( umask 77 && mkdir -p \"` echo $HOME/.ansible/tmp/ansible-tmp-1471585155.14-189251857196240 `\" && echo ansible-tmp-1471585155.14-189251857196240=\"` echo $HOME/.ansible/tmp/ansible-tmp-1471585155.14-189251857196240 `\" )` returned empty string"
有了这个故障,于是我在github上找到了相同的问题,并且找到了解决办法。
问题分析:
这个问题,本质是由于ansbile在2.x,引入了ControlMaster来优化ssh链接的消耗问题。但是这个ControlMaster要依赖于的openssh,如果恰好机器上安装了openssh的高版本,那么就不会出现问题。那么如果是没有安装,那么又要说是ansible的bug了。好了,现在问题找到了,那么解决办法也自然而然了。
下面补充ControlMaster的工作原理讲解
在使用 OpenSSH 登陆到远端服务器时,通常我们会这么做:ssh [email protected] 执行这个命令,成功登陆服务器后,客户端与服务器建立了一个安全的 TCP/IP 连接。用户每执行一次命令,就会有一个新的连接建立,并一直维持连接直到用户退出。如果用户有大量的连接请求,就需要建立并维持大量的 TCP/IP 连接,消耗用户和主机的资源。 OpenSSH 提供一个叫做 ControlMaster 的功能,可以有效缓解这一问题。在使用 ControlMaster后,ssh与服务器建立一个Master连接,之后的所有连接都可以重用这一通道,也就是说不管有多少访问请求,都只需要维护一个TCP/IP连接。
解决方案有两个
- 提高 SSH 的版本,在测试后期,我换用了 CentOS 7 ,当然也可以不换操作系统,只升级 openssh。
- 禁用该功能特性
方法一:
# vim /etc/ansible/ansible.cfg [ssh_connection] ssh_args = -o ControlMaster=no -o ControlPersist=no
方法二:
[[email protected] ~]# yum update openssh -y