当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