Ansible을 사용하여 개발 서버를 프로비저닝하고 있습니다.
나는 항상 나를 위해 몇 가지 서비스를 시작하기를 원합니다. 이 목적을위한 핸들러가 있지만 조건없이 핸들러 실행을 트리거하는 가장 좋은 방법은 무엇입니까?
이 같은:
tasks:
- name: Trigger handler
run_handler: name=nginx-restart
Ansible을 사용하여 개발 서버를 프로비저닝하고 있습니다.
나는 항상 나를 위해 몇 가지 서비스를 시작하기를 원합니다. 이 목적을위한 핸들러가 있지만 조건없이 핸들러 실행을 트리거하는 가장 좋은 방법은 무엇입니까?
이 같은:
tasks:
- name: Trigger handler
run_handler: name=nginx-restart
답변:
매번 핸들러를 트리거해야하는 경우 다음 두 가지 옵션이 있습니다.
1) noop shell 명령을 실행하면 항상 변경된 것으로보고됩니다.
- name: trigger nginx-restart
command: /bin/true
notify: nginx-restart
2) changed_when : 과 함께 디버그를 사용 하여 핸들러를 트리거하십시오.
- debug: msg="trigger nginx-restart"
notify: nginx-restart
changed_when: true
또한의 주 모드 옵션 1과 확인 : 당신은 사용할 수 있습니다 check_mode: no
Ansible 버전 2.2 이상 또는를 사용하는 경우 always_run: yes
작업이 체크 모드에서 스킵되지 않습니다 그래서보다 이전 버전을 사용하는 경우. 내 수동 테스트에서 처리기가 검사 모드로 유지되는 것처럼 보이지만 사례가 다를 수 있으므로주의하십시오.
changed_when
안에 더 많은 로직을 사용하여 비등 전성 작업 (일부 경우 두 번 이상 호출 될 수 있음)을 작업이 아닌 처리기로서 구현했습니다.
1) 모든 처리기를 항상 강제 실행하려면 https://github.com/ansible/ansible/issues/4777에ansible-playbook playbook.yml --force-handlers
설명 된 대로을 실행 하십시오.
2) 플레이 북 내 특정 지점에 통보 된 핸들러를 강제로 실행하려면 메타 태스크 https://docs.ansible.com/playbooks_intro.html을 사용할 수 있습니다 .
tasks:
- shell: some tasks go here
- meta: flush_handlers
- shell: some other tasks
3) 그러나 다른 작업의 결과에 관계없이 서비스가 실행 중이거나 다시 시작되도록하려는 것 같습니다. 이 경우 처리기를 사용하지 말고 Ansible의 service
모듈 을 호출하는 새 작업을 사용 하십시오 . http://docs.ansible.com/service_module.html
tasks:
- name: ensure ntp is running
service: name=ntp state=started enabled=yes
- name: always reload nginx
service: name=nginx state=reloaded
- name: always restart MySQL
service: name=mysql state=restarted
서비스를 다시 시작하는 것이 한 가지입니다. 실행 중인지 확인하는 것도 또 다른 방법입니다. 당신이 원하는 경우 ansible
확인하기 위해 nginx
실행되고, 당신은이 작업을 수행 :
tasks:
- name: Ensure nginx is running
service: name=nginx state=started