***本記事にはプロモーションが含まれています。***
VagrantとAnsibleを使っていると、たびたびエラーになります。
そのデバッグに役立ったことを紹介します。
Vagrantの場合
Vagrantでプロビジョニングをしてエラーになったときは、次のようにします。
VAGRANT_LOG=info vagrant provision
を実行する。
エラーになると次のような表示が確認できる。
ERROR vagrant: The SSH command responded with a non-zero exit status. Vagrant assumes that this means the command failed. The output for this command should be in the log above. Please read the output to determine what went wrong.
調べてみるとログの上の方にこんな情報がありました。
INFO interface: info: Could not get lock /var/lib/dpkg/lock - open (11: Resource temporarily unavailable) INFO interface: info: ==> default: Could not get lock /var/lib/dpkg/lock - open (11: Resource temporarily unavailable)
apt-getのエラーのようで、vagrant sshでゲストOSにログインしてapt-getしてみても原因はつかめず。もう1度vagrant provisionしてみると成功しました。一時的にエラーになっただけのようでした。
Ansible単独の場合
AnsibleはSSHで接続できていないと動きません。そのためSSHのチェックが重要になります。
まず、次のコマンドで接続を確かめます。
ansible -vvvv all -m ping
を実行してみる。
表示色が濃い青色で読めないときは、ANSIBLE_NOCOLOR=1をつけます。
ANSIBLE_NOCOLOR=1 ansible -vvvv all -m ping
ログのポイントは次のところです。ESTABLISH SSH CONNECTION FOR USERでssh接続のユーザー名が間違っていないか。
SSH:EXEC sshのところで、この場合sshから192.168.33.10までがsshのコマンドラインになります。とりあえずこのIPアドレスまでをコピーしてペーストして単独で接続できるか見てみます。
<192.168.33.10> ESTABLISH SSH CONNECTION FOR USER: ubuntu <192.168.33.10> SSH: EXEC ssh -vvv -C -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no -o 'IdentityFile=".vagrant/machines/default/virtualbox/private_key"' -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o User=ubuntu -o ConnectTimeout=10 -o ControlPath=/tmp 192.168.33.10 '/bin/sh -c '"'"'chmod u+x /home/ubuntu/.ansible/tmp/ansible-tmp-1496030041.85-156969875839371/ /home/ubuntu/.ansible/tmp/ansible-tmp-1496030041.85-156969875839371/ping.py && sleep 0'"'"''
sshからIPアドレスまでの部分だけをコピーペーストで新しく張り付けて実行してみます。
ssh -vvv -C -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no -o 'IdentityFile=".vagrant/machines/default/virtualbox/private_key"' -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o User=ubuntu -o ConnectTimeout=10 -o ControlPath=/tmp 192.168.33.10
これで接続できているかまず確認しましょう。
sshで接続できていれば、問題の切り分けができます。あとはpythonのスクリプトが実行できているかどうかです。