ansible “failed to resolve remote temporary directory from ansible-tmp” 问题最终解决办法

概要 原本是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

发表评论

电子邮件地址不会被公开。 必填项已用*标注

This blog is kept spam free by WP-SpamFree.