Я пытаюсь перезагрузить 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).
Попробуйте запустить Ansible с 'ANSIBLE_KEEP_REMOTE_FILES = 1'. Затем запустите вручную скрипт Python, сгенерированный для обработчика на целевой машине (затем через SSH, как в трассировке).Если он не вернется в приглашение, вы можете сравнить скрипт с тем, который задан для этой задачи. Если он вернется, попробуйте изменить конфигурацию и повторно запустить, если она все еще работает правильно, тогда нет подсказки ... Можете ли вы создать и включить полный, воспроизводимый пример с Vagrant? – techraf
Я не знал об этом, спасибо! Это сказано; это, кажется, не делает мне много хорошего, потому что запуск его как команды (из .ansible) или роли внутри игрового журнала после его неудачи в первый раз всегда преуспевает. Итак ... в первый раз, когда он работает как обработчик, он терпит неудачу. В последующие времена это удается просто отлично. Задача выполняется успешно в первый раз. Знаете ли вы, как вы нажимаете команду на удаленный сервер, но забудьте перед запуском? Таким образом, я мог бы запустить эту команду в первый раз за пределами учебника и посмотреть, что он делает. – cycala
О, еще, я никогда раньше не использовал Бродягу, так что это был бы здоровенный подъем. На данный момент я использую AWS-изображения EC2, и я удалил изображение и запустил этот материал примерно 50 раз, и он очень повторяется; он никогда не работал с первой попытки. – cycala