私が書いたタスクの一部は開始し、終了することはありません。 Ansibleは、-vvvvオプションを使用しても、これを説明するエラーやログを提供しません。プレイブックはハングアップするだけで、時間が経過しても何も変わりません。
(SSH経由でコマンドを入力して)手動でタスクを実行しようとすると、すべてがうまくいきます。
ハングするタスクの例:
- name: apt upgrade
Shell: apt-get upgrade
Stdoutとstderrを見る方法はありますか?私は試した:
- name: apt upgrade
Shell: apt-get upgrade
register: hello
- debug: msg="{{ hello.stdout }}"
- debug: msg="{{ hello.stderr }}"
しかし、何も変わっていません。
必要な権限があり、正しいSudoパスワードを渡します-Sudoを必要とする他のタスクは正しく実行されます。
私はプレイブックでも同じ問題を抱えていました。
ある時点まで完全に動作してから停止したため、この動作を回避するためにasyncおよびpollパラメーターを追加しました
- name: update packages full into each server
apt: upgrade=full
ignore_errors: True
async: 60
poll: 60
そしてそれは魅力のように働いた!何が起こったのか本当に分かりませんが、今はAnsibleが何が起こっているかを念頭に置き、もうフリーズしないようです!
それが役に立てば幸い
問題の最も可能性の高い原因はSSH接続です。タスクに長い実行時間が必要な場合、SSHタイムアウト。このような問題に一度直面しました。SSHタイムアウトの問題を克服するために、Ansibleを実行している現在のディレクトリにansible.cfgを作成し、以下を追加します。
[ssh_connection]
ssh_args = -o ServerAliveInterval=n
ここで、n
は、SSHを介してサーバーに接続するときに使用するServerAliveInterval(秒)です。 1〜255の間に設定します。これにより、sshクライアントはn
秒ごとにヌルパケットをサーバーに送信して、接続タイムアウトを回避します。
私は同じ問題を抱えていたので、少しいじくり回した後、事実を収集する段階にあることがわかりました。同様の問題を解決するためのヒントをいくつか紹介します。
プレイブックでファクトギャザリングを無効にします。
_---
- hosts: myservers
gather_facts: no
..
_
プレイブックを再実行します。それが機能する場合、原因はSSH自体ではなく、事実を収集するスクリプトにあることを意味します。この問題は非常に簡単にデバッグできます。
.ansible
_フォルダーのどこかにあるsetup
ファイルを見つけます。./setup
_または_python -B setup
_で実行しますハングした場合、問題は確実にここにあることがわかります。ハングする原因を正確に見つけるには、エディターでファイルを開き、主にprint
のpopulate()
メソッドにFacts
ステートメントを追加します。スクリプトを再実行して、それがどれだけ長くなるかを確認します。
私にとっては、問題はself.facts['fqdn'] = socket.getfqdn()
行のホスト名を解決しようとしているようで、少しグーグルで リモートホスト名の解決 の問題であることが判明しました。
私にとってまったく異なる回避策。これをDebian Jessie(Linux PwC-Deb64 3.16.0-4-AMD64 #1 SMP Debian 3.16.7-ckt25-2+deb8u3 (2016-07-02) x86_64 GNU/Linux
)からAWSでビルドしようとした別のDebianイメージまで持っていました。
ここでの提案の多くが役に立たなかった後、SSH「共有」接続に疑念を抱きました。 ansible.cfg
に行き、ssh_args
行を見つけてControlMaster=no
を設定しました。これにより、SSHパフォーマンスの向上が失われるため、パフォーマンスが低下する可能性がありますが、この問題とapt-get
の間に何らかの相互作用があるようです。
ansible.cfg
は、ansible
を実行するディレクトリまたは/etc/ansible
にあります。後者の場合、変更を開始する前に、そのコピーをローカルディレクトリに保存することができます。
SSHキーのパスワードを削除すると、次のように修正されました。
ssh-keygen -p