新しいpf.confをシステムにコピーした後、FreeBSDサーバをプロビジョニングする役割の一部としてpfを再ロードしようとしています。このステップを自分のプレイブックの一部としてタスクとして独立して実行すると、完璧に機能します。しかし、私はハンドラと全く同じ動作をしていると、そのハンドラの実行中に常にハングします。Ansibleはハンドラのアクションでハングアップしますが、タスクのアクションで正常に動作します(pfの再ロード)
成功したプレイ:
- hosts: tag_Name_web ; all ec2 instances tagged with web
gather_facts: True
vars:
ansible_python_interpreter: /usr/local/bin/python2.7
ansible_become_pass: xxx
tasks:
- name: copy pf.conf
copy:
src: pf.template
dest: /etc/pf.conf
become: yes
become_method: su
- name: reload pf
shell: /sbin/pfctl -f /etc/pf.conf
become: yes
become_method: su
- name: echo
shell: echo "test"
become: yes
become_method: su
を(私はリロードがプレーをやっていた最後のものだったが、それが正常に動作しますので、それが続くかもしれないと思ったように私は、テストとしてエコーを含みます)。
# handlers file for jail_host
- name: Start iocage
command: service iocage start
- name: Reload sshd
service: name=sshd state=reloaded
- name: Reload pf
shell: "/sbin/pfctl -f /etc/pf.conf"
ハンドラが確実に呼び出され、それが動作するように開始し、その後、それだけでハングアップ:失敗し
ハンドラが、あります。 (私がシステム上でpfctl -saを実行すると、新しいpf.confが実際にリロードされたことがわかります。それが機能しているので、戻ってこないので、残りの実行は起こりません)。
以下は、実行中のハンドラのデバッグ出力ですが、わかりやすいエラーは表示されません。私が知る限り、タイムアウトはありません。私はそれがCtrl-Cの前に30分間走らせた。
RUNNING HANDLER [JoergFiedler.freebsd-jail-host : Reload pf] *******************
Using module file /usr/local/lib/python2.7/site-packages/ansible/modules/core/commands/command.py
<54.244.77.100> ESTABLISH SSH CONNECTION FOR USER: ec2-user
<54.244.77.100> SSH: EXEC ssh -C -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no -o 'IdentityFile="/usr/local/etc/ansible/xxx_aws.pem"' -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o User=ec2-user -o ConnectTimeout=10 -o ControlPath=/root/.ansible/cp/ansible-ssh-%h-%p-%r 54.244.77.100 '/bin/sh -c '"'"'(umask 77 && mkdir -p "` echo ~/.ansible/tmp/ansible-tmp-1487698172.0-93173364920700 `" && echo ansible-tmp-1487698172.0-93173364920700="` echo ~/.ansible/tmp/ansible-tmp-1487698172.0-93173364920700 `") && sleep 0'"'"''
<54.244.77.100> PUT /tmp/tmpBrFVdu TO /home/ec2-user/.ansible/tmp/ansible-tmp-1487698172.0-93173364920700/command.py
<54.244.77.100> SSH: EXEC sftp -b - -C -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no -o 'IdentityFile="/usr/local/etc/ansible/xxx_aws.pem"' -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o User=ec2-user -o ConnectTimeout=10 -o ControlPath=/root/.ansible/cp/ansible-ssh-%h-%p-%r '[54.244.77.100]'
<54.244.77.100> ESTABLISH SSH CONNECTION FOR USER: ec2-user
<54.244.77.100> SSH: EXEC ssh -C -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no -o 'IdentityFile="/usr/local/etc/ansible/xxx_aws.pem"' -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o User=ec2-user -o ConnectTimeout=10 -o ControlPath=/root/.ansible/cp/ansible-ssh-%h-%p-%r 54.244.77.100 '/bin/sh -c '"'"'chmod u+x /home/ec2-user/.ansible/tmp/ansible-tmp-1487698172.0-93173364920700/ /home/ec2-user/.ansible/tmp/ansible-tmp-1487698172.0-93173364920700/command.py && sleep 0'"'"''
<54.244.77.100> ESTABLISH SSH CONNECTION FOR USER: ec2-user
<54.244.77.100> SSH: EXEC ssh -C -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no -o 'IdentityFile="/usr/local/etc/ansible/xxx_aws.pem"' -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o User=ec2-user -o ConnectTimeout=10 -o ControlPath=/root/.ansible/cp/ansible-ssh-%h-%p-%r -tt 54.244.77.100 '/bin/sh -c '"'"'su root -c '"'"'"'"'"'"'"'"'/bin/sh -c '"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'echo BECOME-SUCCESS-cntrcxqxlwicicvwtinmaadrnzzzujfp; /usr/local/bin/python2.7 /home/ec2-user/.ansible/tmp/ansible-tmp-1487698172.0-93173364920700/command.py; rm -rf "/home/ec2-user/.ansible/tmp/ansible-tmp-1487698172.0-93173364920700/" > /dev/null 2>&1'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"''"'"'"'"'"'"'"'"' && sleep 0'"'"''
私は、コマンドを使用して、サービスモジュールを使用して.. PFをリロードする他の方法の多くを試してみた:サービスPFのリロードを、そしてそれらはすべてまったく同じ効果を持ちます。私はまた、ハンドラを非同期化しようとしました。
- name: Reload pf
shell: "/sbin/pfctl -f /etc/pf.conf"
async: 1
poll: 0
変更なし。
ハンドラを使用した私の役割が失敗した理由は誰でも知っていますか?タスクの簡単な演奏は成功しますか?さらに重要なことは、ハンドラを適切に動作させるにはどうしたらいいですか?
ありがとうございます!
(私はAnsible 2.2.1を使用していることに注意してください)。
ANSIBLE_KEEP_REMOTE_FILES = 1でAnsibleを実行してみてください。次に、ターゲットマシン上のハンドラ用に生成されたPythonスクリプトを手動で実行します(トレースのようにSSHを使用して実行します)。プロンプトに戻らない場合は、そのスクリプトをタスクのスクリプトと比較することができます。それが返ってきたら、設定を修正して再実行してください。まだ正常に実行されていれば、手がかりはありません... Vagrantで再現可能な完全な例を作成して含めることはできますか? – techraf
私はそれを知らなかった、ありがとう!それは言った。それは最初から失敗した後にコマンド(.ansibleから)またはプレイブック内の役割としてそれを実行することが常に成功するので、それは多くの良いことをしているようではありません。 ...初めてハンドラとして実行すると失敗します。それ以降は、うまくいく。タスクは初めて成功します。 リモートサーバーにコマンドをプッシュする方法はありますか?そうすれば、私はプレイブックの外で初めてこのコマンドを実行し、それが何をしているのかを見ることができます。 – cycala
ああ、また、私は前にヴァーグラントを使用したことがないので、それはかなりのリフトになります。現時点ではAWS EC2イメージを使用していますが、イメージを削除して50回ほど実行しましたが、これは非常に繰り返しが可能です。最初の試行では一度も動作しませんでした。 – cycala