※ Ansible Advent Calendar 2014の 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.
残念ですが、自分でmakeして入れます。
$ 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