2017-02-21 10 views
1

新しい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を使用していることに注意してください)。

+1

ANSIBLE_KEEP_REMOTE_FILES = 1でAnsibleを実行してみてください。次に、ターゲットマシン上のハンドラ用に生成されたPythonスクリプトを手動で実行します(トレースのようにSSHを使用して実行します)。プロンプトに戻らない場合は、そのスクリプトをタスクのスクリプトと比較することができます。それが返ってきたら、設定を修正して再実行してください。まだ正常に実行されていれば、手がかりはありません... Vagrantで再現可能な完全な例を作成して含めることはできますか? – techraf

+0

私はそれを知らなかった、ありがとう!それは言った。それは最初から失敗した後にコマンド(.ansibleから)またはプレイブック内の役割としてそれを実行することが常に成功するので、それは多くの良いことをしているようではありません。 ...初めてハンドラとして実行すると失敗します。それ以降は、うまくいく。タスクは初めて成功します。 リモートサーバーにコマンドをプッシュする方法はありますか?そうすれば、私はプレイブックの外で初めてこのコマンドを実行し、それが何をしているのかを見ることができます。 – cycala

+0

ああ、また、私は前にヴァーグラントを使用したことがないので、それはかなりのリフトになります。現時点ではAWS EC2イメージを使用していますが、イメージを削除して50回ほど実行しましたが、これは非常に繰り返しが可能です。最初の試行では一度も動作しませんでした。 – cycala

答えて

2

これは、ansibleとPFないでより多くの問題では、あなたの脚本をもう一度試してみるが、この時間は、あなたのpf.rulesにこれを使用するようだ:

pass all 

あなたは、ログインすることにより、実際にもテストすることができますインスタンスにだけ実行します。

/etc/pf.conf.allpass allが含まれてい
/sbin/pfctl -Fa -f /etc/pf.conf.all 

、それはあなたアウトしたり、電流増幅率を記録するべきではありませんntセッションはアクティブのままでなければなりません。

おそらく、起こっていることは、あなたのSSHルールが適用されたときにあなたのpfルールが削除されている/フラッシングしているためです。

+1

上記のtechrafへの私のコメントで述べたように、これは確かに問題です。 "コマンド:sleep 10; pfctl -f /etc/pf.conf"アクションを実行し、次のハンドラが実行される前に "一時停止:秒:20"に別のハンドラを追加することで、すべて正常に動作します。私はなぜ死んだssh接続から回復できないのか分かりませんが、今は解決策があります。 - ありがとう! – cycala

0

多分あなたのハンドラでは次のものが必要ですか?

become: yes 
become_method: su 
+0

提案をお寄せいただきありがとうございますが、私は親の役割でそれを持っており、他のハンドラのために働いています(実際にはこのハンドラのために働いていますが、実際には新しい設定を取得します。設定を取得していない)。また、デバッグでは、私はそれがsu rootを呼び出して参照してください。 – cycala

+0

'shell:'の代わりに 'command:'はどうですか? –

+0

同じ効果があります。実際には、 "shell.py"のコードを見ると、それは単に "command.py"の周りのラッパーにすぎませんが、パイプのようなものまではもっと能力があります。コマンドで始まったが、何かが変わることを期待してシェルに変わった)。 – cycala

関連する問題