当Mac上的Ansible不再运行时,首要行动是什么?

这是2014年Ansible Advent Calendar第7天的文章。如果之前看到过,请忽略。

发生时间

说实话,我不太明白。
我也是一样吗?之前还能正常运作的啊…
感觉是这样的。

错误信息

我在网上进行了大量的调查,但是发现不同的人会出现各种不同的错误。
在我的情况下,出现了以下这些错误。

# fatal: [localhost] => Traceback (most recent call last):
#   File "/usr/local/Cellar/ansible/1.7.2/lib/python2.7/site-packages/ansible-1.7.2-py2.7.egg/ansible/runner/__init__.py", line 561, in _executor
#     exec_rc = self._executor_internal(host, new_stdin)
#   File "/usr/local/Cellar/ansible/1.7.2/lib/python2.7/site-packages/ansible-1.7.2-py2.7.egg/ansible/runner/__init__.py", line 696, in _executor_internal
#     complex_args=complex_args
#   File "/usr/local/Cellar/ansible/1.7.2/lib/python2.7/site-packages/ansible-1.7.2-py2.7.egg/ansible/runner/__init__.py", line 884, in _executor_internal_inner
#     result = handler.run(conn, tmp, module_name, module_args, inject, complex_args)
#   File "/usr/local/Cellar/ansible/1.7.2/lib/python2.7/site-packages/ansible-1.7.2-py2.7.egg/ansible/runner/action_plugins/template.py", line 77, in run
#     source = utils.path_dwim_relative(inject['_original_file'], 'templates', # # source, self.runner.basedir)
#   File "/usr/local/Cellar/ansible/1.7.2/lib/python2.7/site-packages/ansible-1.7.2-py2.7.egg/ansible/utils/__init__.py", line 339, in path_dwim_relative
#     template2 = os.path.join(basedir, '..', dirname, source)
#   File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/posixpath.py", line 75, in join
#     if b.startswith('/'):
# AttributeError: 'dict' object has no attribute 'startswith'
# 
# FATAL: all hosts have already failed -- aborting

导致这个问题的根本原因是什么?

调查了很多事情,但要把所有内容都写出来很麻烦,
所以总结一下,

因为没有安装sshpass!

应对

以以下方式进行ping测试时,会出现以下错误。

$ ansible -i hosts 127.0.0.1 -m ping -vvv --ask-pass
SSH password: 
# <127.0.0.1> ESTABLISH CONNECTION FOR USER: username
# <127.0.0.1> REMOTE_MODULE ping
# 127.0.0.1 | FAILED => to use the 'ssh' connection type with passwords, you must  install the sshpass program

既然这样,原因是没有sshpass。
所以,我们会安装sshpass。

提前告诉你,无法使用homebrew安装。
只是在搜寻包时会出现这样的消息。

$ brew search sshpass
# We won't add sshpass because it makes it too easy for novice SSH users to ruin SSH's security.

很遗憾,但是我将自己制作并安装。

$ curl -O -L http://downloads.sourceforge.net/project/sshpass/sshpass/1.05/sshpass-1.05.tar.gz
$ tar -zxvf sshpass-1.05.tar.gz
$ cd ./sshpass-1.05
$ ./configure
$ make
$ make install

我已经进去了,所以我会再试一次。

$ ansible -i hosts 127.0.0.1 -m ping -vvv --ask-pass
SSH password: 
(中略)
# 127.0.0.1 | success >> {
#     "changed": false, 
#     "ping": "pong"
# }

如果情况变成这样,那就算成功了。
现在又可以使用了。
真是可喜可贺啊…
真是可喜可贺啊…

加赠品

当你在搜索stockoverflow之类的内容时,会出现一种说法,即由于ssh连接已转变为paramiko。但对于Mac来说,这并不是原因。我也尝试了这种方式,但没有关联性。但是,如果在Linux服务器等中发生了类似的情况,我认为我们应该怀疑这个说法。

因为Paramiko是用Python编写的,所以可以使用pip进行安装。

$ pip install paramiko
广告
将在 10 秒后关闭
bannerAds