ansible “failed to resolve remote temporary directory from ansible-tmp” 问题最终解决办法 ansible
概要 原本是ansible1.9.x的版本,后来升级了ansible的版本之后出现,failed to resolve remote temporary directory from ansible-tmp……问题。连最基本的ping模块都使用不了了。
现在使用的ansible的版本是:2.2.1.0
[root@localhost ansible]# ansible --version ansible 2.2.1.0 config file = /etc/ansible/ansible.cfg configured module search path = Default w/o overrides
问题如下:
[root@localhost ansible]# ansible all -m ping 10.0.10.2 | FAILED! => { "failed": true, "msg": "failed to resolve remote temporary directory from ansible-tmp-1497056262.2-2494116636663 `( umask 77 && mkdir -p \"` echo ~/.ansible/tmp/ansible-tmp-1497056262.2-249411663666383 `\" && echnsible-tmp-1497056262.2-249411663666383=\"` echo ~/.ansible/tmp/ansible-tmp-1497056262.2-249411663663 `\" )` returned empty string" }
问题分析:
这个问题,本质是由于ansbile在2.x,引入了ControlMaster来优化ssh链接的消耗问题。但是这个ControlMaster要依赖于的openssh,如果恰好机器上安装了openssh的高版本,那么就不会出现问题。那么如果是没有安装,那么又要说是ansible的bug了。好了,现在问题找到了,那么解决办法也自然而然了。
下面补充ControlMaster的工作原理讲解
在使用 OpenSSH 登陆到远端服务器时,通常我们会这么做:ssh user@IP执行这个命令,成功登陆服务器后,客户端与服务器建立了一个安全的 TCP/IP 连接。用户每执行一次命令,就会有一个新的连接建立,并一直维持连接直到用户退出。如果用户有大量的连接请求,就需要建立并维持大量的 TCP/IP 连接,消耗用户和主机的资源。OpenSSH 提供一个叫做 ControlMaster 的功能,可以有效缓解这一问题。在使用 ControlMaster后,ssh与服务器建立一个Master连接,之后的所有连接都可以重用这一通道,也就是说不管有多少访问请求,都只需要维护一个TCP/IP连接。
方法一:这是我最开始在gitbub上看到的一个大神的解决方案,也就是关闭ssh ControlMaster功能。
这种方案确确实实是可行的,但是我没有选择。因为我觉得存在既有道理,于是最后我就发现了是openssh的问题。
方法二:安装高版本的openssh:
yum update openssl openssh openssh-server openssh-clients -y
好了,这这个问题解决了