Memo/Ansible/Troubleshooting

https://dexlab.net:443/pukiwiki/index.php?Memo/Ansible/Troubleshooting
 

Troubleshooting: トラブルシューティング

  • ansible-playbookコマンドに「-vvv」を付ける
  • 「debug: var=<name>」で変数を見る
  • リモートの一時ファイルを残す。「$HOME/.ansible/tmp/」に残ったままになる。
  • pythonのデバッグログを出力する
    ANSIBLE_DEBUG=1 ansible -i ...

ssh: 並列実行時に誤ったホストへ接続される

  • 問題
    • ansible,ansible-playbookを複数同時実行すると、誤ったホストへ接続される。
    • 「ControlMaster=auto」が有効。ansible 2.6.4ではデフォルトで有効だった。
    • ./ssh-configが環境毎に複数あり、同一の「Host web-0001」のような設定がされている。「HostName ec2-xxx...」で実際の異なるホスト名を指定している。
      Host web-001
        HostName ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com
    • ansible.cfg
      [ssh_connection]
      ssh_args = -C -o ControlMaster=auto -o ControlPersist=60 -F ./ssh-config
  • 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内のホスト名が同じだと、 「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が使えないと失敗する
  • 接続先ホストでrequirettyを無効にする必要がある。
    sudo vim /etc/sudoers
    ----
    Defaults    !requiretty
    ----
  • または ansible -c paramiko を指定する

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-12-04 (火) 18:40:29 (14d)