2016-07-01 4 views
4

작업 파일의 이전 작업 중 이 변경된 경우에만 작업 파일의 끝에 하나의 작업을 실행하려는 역할을하고 있습니다.작업 파일의 이전 다른 작업이 변경된 경우에만 실행되는 안전한 역할 작업 작성 방법?

- name: install package 
    apt: name=mypackage state=latest 

- name: modify a file 
    lineinfile: do stuff 

- name: modify a second file 
    lineinfile: other stuff 

- name: restart if anything changed 
    service: name=mypackage state=restarted 

을 ... 그리고 업데이트가 설치되어있는 또는 설정 파일 중 하나가 변경된 경우에만 서비스를 다시 시작하려면 :

예를 들어, 내가있다.

어떻게하면됩니까?

답변

6

여기서 가장 좋은 방법은 handlers을 사용하는 것입니다. 역할에

는 콘텐츠와 파일 handlers/main.yml을 만듭니다

- name: restart mypackage 
    service: name=mypackage state=restarted 

는 모든 작업에서이 핸들러를 통지합니다. 작업이 변경된 상태 (= 노란색 출력)

- name: install package 
    apt: name=mypackage state=latest 
    notify: restart mypackage 

- name: modify a file 
    lineinfile: do stuff 
    notify: restart mypackage 

- name: modify a second file 
    lineinfile: other stuff 
    notify: restart mypackage 

핸들러가 귀하의 놀이의 맨 끝에 실행됩니다를보고 경우에만 처리기가 통보됩니다. 당신이 다시 시작된 myPackage에 서비스에 종속 관련된 다른 역할이있는 경우 역할의 끝에서 모든 처리기를 세척 할 수 있습니다 :

- meta: flush_handlers 

추가로 force_handlers 설정을 살펴 있습니다. mypackge 역할 이후에 처리 된 다른 역할에서 오류가 발생하면 처리기가 트리거되지 않습니다. ansible.cfgforce_handlers=True을 설정하면 오류가 발생한 후에도 처리기가 강제로 실행됩니다. 다음 번에 파일이 변경되지 않으므로 핸드북을 실행할 때 처리기가 알림을받지 못하기 때문에 이는 매우 중요한 주제이므로 서비스가 다시 시작되지 않습니다.


핸들러를 사용하지 않고도이 작업을 수행 할 수 있지만 매우 추합니다. 나중에 다시 시작 작업에 적용되는 조건에서 상태를 확인할 수 있도록 모든 단일 작업의 출력을 등록해야합니다.

- name: install package 
    apt: name=mypackage state=latest 
    register: mypackage_1 

- name: modify a file 
    lineinfile: do stuff 
    register: mypackage_2 

- name: modify a second file 
    lineinfile: other stuff 
    register: mypackage_3 

- name: restart if anything changed 
    service: name=mypackage state=restarted 
    when: mypackage_1 | changed or mypackage_2 | changed or mypackage_3 | changed 

Ansible Handler notify vs register에 대한 답을 참조하십시오.

+0

아, 훌륭합니다. 변경 사항이 등록되어있을 때만 처리기가 시작된다는 것을 전혀 생각하지 못했고, ** 그들은 연극이 끝날 때 모두 해고되었습니다. 처음에는 등록과 알림 사이의 혼합에 대해 생각해 보았지만 이러한 문제는 해결되었습니다. 감사! – rasebo