2017-02-21 36 views
1

Я пытаюсь перезагрузить pf как часть роли для предоставления FreeBSD-сервера после копирования нового pf.conf в систему. Когда я делаю этот шаг независимо как задачу как часть собственной игровой книги, она работает безупречно. Однако, когда у меня есть точно такое же действие, как и обработчик, всегда выполняется зависание во время выполнения этого обработчика.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 был фактически перезагружен. Поэтому он работает, он просто не возвращается и, следовательно, делает остальную часть незаметного прогона не случается).

Ниже представлен вывод отладки обработчика, но я не вижу ошибок, которые я могу понять. Насколько я могу судить, нет таймаута; Я разрешил ему работать за 30 минут до Ctrl-C.

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'"'"'' 

Я также пробовал много других способов перезагрузки пф .. используя модуль обслуживания, используя команду: службы пф перезаряжает, и все они имеют точно такой же эффект. Я также попытался сделать обработчик асинхронным, с

- name: Reload pf 
    shell: "/sbin/pfctl -f /etc/pf.conf" 
    async: 1 
    poll: 0 

без изменений.

У кого-нибудь есть идея, почему моя роль с обработчиком не удалась, а простая игра с задачами преуспела? И что еще более важно, как я могу заставить обработчик работать правильно?

Заранее благодарен!

(Должен заметить, что я использую Ansible 2.2.1).

+1

Попробуйте запустить Ansible с 'ANSIBLE_KEEP_REMOTE_FILES = 1'. Затем запустите вручную скрипт Python, сгенерированный для обработчика на целевой машине (затем через SSH, как в трассировке).Если он не вернется в приглашение, вы можете сравнить скрипт с тем, который задан для этой задачи. Если он вернется, попробуйте изменить конфигурацию и повторно запустить, если она все еще работает правильно, тогда нет подсказки ... Можете ли вы создать и включить полный, воспроизводимый пример с Vagrant? – techraf

+0

Я не знал об этом, спасибо! Это сказано; это, кажется, не делает мне много хорошего, потому что запуск его как команды (из .ansible) или роли внутри игрового журнала после его неудачи в первый раз всегда преуспевает. Итак ... в первый раз, когда он работает как обработчик, он терпит неудачу. В последующие времена это удается просто отлично. Задача выполняется успешно в первый раз. Знаете ли вы, как вы нажимаете команду на удаленный сервер, но забудьте перед запуском? Таким образом, я мог бы запустить эту команду в первый раз за пределами учебника и посмотреть, что он делает. – cycala

+0

О, еще, я никогда раньше не использовал Бродягу, так что это был бы здоровенный подъем. На данный момент я использую AWS-изображения EC2, и я удалил изображение и запустил этот материал примерно 50 раз, и он очень повторяется; он никогда не работал с первой попытки. – cycala

ответ

2

Это, кажется, больше проблема с PF не с анзибль, дать еще раз попробовать ваш сборник пьес, но на этот раз использовать это на pf.rules:

pass all 

Вы действительно можете также тест по логину к примеру и просто запустить:

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

где /etc/pf.conf.all содержит pass all, он не должен войти вас или ваш Curre nt сессия должна оставаться активной.

Что, вероятно, происходит, так это то, что ваши правила pf снижают/смывают существующие соединения при их применении, поэтому ваш SSH (незаметный) зависает.

+1

Как я уже упоминал в своем комментарии к вышеприведенному выше, это действительно проблема. Выполнив действие: «command: sleep 10; pfctl -f /etc/pf.conf», а затем добавив еще один обработчик «пауза: секунды: 20» перед запуском следующего обработчика, теперь все работает хорошо. Я не уверен, почему ansible не смог оправиться от мертвого соединения ssh, но теперь у меня есть рабочее решение. - Благодаря! – cycala

0

Возможно, вам нужно следующее в вашем обработчике (-ах)?

become: yes 
become_method: su 
+0

Спасибо за предложение, но у меня есть это в родительской роли, и он работает для других обработчиков (и на самом деле он работает для этого обработчика, так как pf действительно получает новую конфигурацию, если она не получила разрешения на эскалацию, не получили конфигурацию). Кроме того, в отладке я вижу, что он вызывает su root. – cycala

+0

Как насчет 'command:' вместо 'shell:'? –

+0

Тот же эффект; для этого они кажутся идентичными (и на самом деле, глядя на код «shell.py», это всего лишь обертка вокруг «command.py» в любом случае, но позволяет больше возможностей в отношении труб и т. д. началось с команды, но сменилось на оболочку в надежде, что что-то изменится). – cycala