Troubleshooting: トラブルシューティング †
- ansible-playbookコマンドに「-vvv」を付ける
- 「debug: var=<name>」で変数を見る
- リモートの一時ファイルを残す。「$HOME/.ansible/tmp/」に残ったままになる。
ssh: 並列実行時に誤ったホストへ接続される †
- Client環境
- CentOS 7
- OpenSSH 7.4, OpenSSL 1.0.2k
- ansible 2.6.4-1
- 再現手順
- ターミナルを2つ開き、60秒以内に( デフォルトControlPersist=60なので ) コマンドを実行する
- sshを直接実行した場合: 正常 。ホスト毎に異なる結果が帰ってくる。
ssh -F ssh-config user@web-001 hostname
- ansible -m setup: 異常 。同じ結果が帰ってくる
ansible -i hosts.ini -m setup web-001 -u user01 | grep -P 'ansible_fqdn|ansible_hostname'
- 片方のansible.cfg で 「ControlMaster=auto」を削除すると正常。
ssh_args = -F ./ssh-config
- 片方の ansible.cfg で 「ControlMaster=auto」は有効なまま、control_pathを以下のように設定すると、正常。
control_path = %(directory)s/%%C
- 原因
- 「ControlMaster=auto」の場合、ssh-config内のhostnameが同じだと、 「control_path] が重複して利用される。
- ansible 2.4 以上のどこかのversionで、 「control_path = ~/.ansible/cp/<unique hash>」のディレクトリが生成されるように変わった。
- 恐らくパスが長すぎると「ControlPath too long」エラーが出るため。
- ansible 2.3 以下では、 「control_path = ~/.ansible/cp/ansible-ssh-<hostname>-22-<user>」のようなディレクトリだった。
- 解決方法
- 複数のssh-config間で uniq hostname を使う。openssh 7.3以上でIncludeが使えるので、1箇所に纏める等。
- control_pathを重複しないように設定する。
- 例:「control_path = %(directory)s/%%C」ただし、「%C」が使えるのはopenssh v6.7以上。ssh-config内のhostname部分まで同じ場合は、同じ問題が起きる。
- 「ControlMaster=auto」を使わない。しかし、sshが遅くなる。
SSHで接続できない場合 †
オプションとして「-vvvv」を付けると詳細なログが出る
pipelining=TrueでSSHが失敗する場合 †
- 「sorry, you must have a tty to run sudo」エラーで失敗する場合
- pipelining pipelining=Trueだと、高速化にはなるが、ttyが使えないと失敗する