Ansible在处理程序中挂起动作,但在任务中执行动作(重新加载pf)

时间:2017-02-21 17:35:23

标签: ansible freebsd

我正在尝试重新加载pf,作为在将新的pf.conf复制到系统后配置FreeBSD服务器的角色的一部分。当我作为一个任务独立完成这一步作为它自己的剧本的一部分时,它可以完美地工作。但是,当我与处理程序具有完全相同的操作时,ansible总是在执行该处理程序期间挂起。

成功的戏剧:

   - 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

(我将echo作为测试包括在内,因为我认为它可能会成功,因为重新加载是游戏最后做的事情,但它运行正常。)

失败的处理程序是:

# 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实际上是重新加载的。所以它正在工作,它只是永远不会返回,因此不会发生其余的ansible运行。)

下面是运行处理程序的调试输出,但我没有看到任何我能理解的错误。据我所知,没有超时;我在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 ..使用服务模块,使用命令:service pf reload,它们都具有完全相同的效果。我还尝试使用

使处理程序异步
- name: Reload pf
  shell: "/sbin/pfctl -f /etc/pf.conf"
  async: 1
  poll: 0

没有变化。

有没有人知道为什么我的处理程序角色失败,而任务的直接游戏成功了?更重要的是,我如何让处理程序正常工作?

提前致谢!

(我应该注意到我正在使用Ansible 2.2.1)。

2 个答案:

答案 0 :(得分:2)

这似乎是PF而不是ansible的更多问题,请再试一次您的剧本,但这一次使用pf.rules

pass all

您还可以通过登录实例进行测试,然后运行:

/sbin/pfctl -Fa -f /etc/pf.conf.all 

其中/etc/pf.conf.all包含pass all,它不应该让您退出,或者您当前的会话应保持有效。

可能发生的事情是你的pf规则在应用时丢弃/刷新现有连接,因此你的SSH(ansible)挂起。

答案 1 :(得分:0)

也许你的处理程序需要以下内容?

become: yes
become_method: su