2017-01-09 1 views
1

전체 재생 목록에서 처리기를 한 번만 실행하고 싶습니다. 전체 재생 목록에 대해 한 번만 실행 가능 처리기

는 나는이 플레이 북 파일에 다음 문을 포함하여 시도했지만이 번 각 놀이를 위해, 여러 번 실행되는 핸들러 결과 :

여기
- name: Configure common config 
    hosts: all 
    become: true 
    vars: 
     OE: "{{ ansible_hostname[5] }}" 
    roles: 
    - { role: common } 
    handlers: 
    - include: handlers/main.yml 

- name: Configure metadata config 
    hosts: metadata 
    become: true 
    vars: 
     OE: "{{ ansible_hostname[5] }}" 
    roles: 
    - { role: metadata } 
    handlers: 
    - include: handlers/main.yml 

메인 핸들러 /의 내용이다. YML :

- name: Configure automount - /opt/local/xxx in /etc/auto.direct 
    lineinfile: 
    dest: /etc/auto.direct 
    regexp: "^/opt/local/xxx" 
    line: "/opt/local/xxx -acdirmin=0,acdirmax=0,rdirplus,rw,hard,intr,bg,retry=2 nfs_server:/vol/xxx" 
    notify: restart autofs 
,691 : 여기
- name: restart autofs 
    service: 
    name: autofs.service 
    state: restarted 

핸들러에 통지하는 작업 중 하나의 예이다

전체 플레이 북에 대해 한 번만 핸드북을 실행하도록 플레이 북을 얻으려면 어떻게해야합니까?

+0

당신의 플레이 북은 좀 거칠어 보입니다. 이 안내서의 일반적인 개념은 무엇이며 여기에 처리기를 포함시키는 이유는 무엇입니까? 핸들러는 태스크에 의해 통지되어야하므로 역할의 일부입니다. 문서에서 처리기 사용 방법을 확인하십시오. https://docs.ansible.com/ansible/playbooks_intro.html. 특정 작업을 한 번만 실행하는 또 다른 방법은 다음과 같습니다. https://docs.ansible.com/ansible/playbooks_delegation.html#run-once –

+0

야생으로 무엇을 의미하는지 확실하지 않습니다. 게임 북은 일련의 연극이며이 예에서는 두 개의 연극이 있습니다. 여러 재생에 대해 단일 처리기를 사용하고 전체 재생 목록에 대해 한 번 실행하도록합니다. 나는 그것이 의미가 있기를 바랍니다. 작업을 한 번만 실행하고 처리기를 한 번만 실행하면됩니다. – user3155618

+0

@techraf 처리기에 알리는 여러 작업이 있습니다. 나는 질문을 편집하고 과제 중 하나를 추가했다. – user3155618

답변

4

제목의 질문에 대한 답은 다음과 같습니다. 그러나 문제에 대한 해결책은 가능하지만 "playbook-handler"(아래 참조)가 아닌 추가 재생을 사용합니다.

플레이 북을 주장 Ansible의 문서에서 긴 소개 노트에도 불구하고 대답

이 오케스트레이션의 기초이며, 플레이 북은 재생 목록 만 현실에 있습니다.

플레이 북에는 네임 스페이스가없고 변수도없고 상태도 없습니다. 모든 구성, 논리, 작업은 연극에 포함됩니다.

처리기가 다른 한편으로는 다른 호출 일정 (순서는 아니지만 조건부로, 한 번 끝에 또는 meta: flush_handlers)을 가진 작업입니다.

따라서 핸들러는 게임에 속하며 게임 북에 속하지 않습니다.


상기 용액

, 각본 번씩 서비스를 재개하는 문제의 해결책은 메모리를 사용하여 재고 해결 될 수있다.

당신은 별도의 플레이에 질문에서 핸들러를 켜고 플레이 북의 끝 부분에 배치 할 수 있습니다 다음과 hosts_to_restart_autofs 목록에 호스트를 추가 할

- hosts: hosts_to_restart_autofs 
    tasks: 
    - name: Perform autofs restart 
     service: 
     name: autofs.service 
     state: restarted 

그런 다음 각 플레이 핸들러를 사용 add_host module :

handlers: 
    - name: restart autofs 
    add_host: 
     name: "{{ inventory_hostname }}" 
     groups: hosts_to_restart_autofs 

이 방법 대신 대상 노드에 직접 서비스를 다시 시작의 처리기, 대신에 메모리 재고에 해당 노드의 호스트 이름을 추가합니다. 두 번째 재생으로 인해 처리기가 통지 될 경우 호스트 이름은 이미 목록에 있습니다.

마지막 재생은 다중 재생에서 처리기로 목록에 추가 된 대상 노드에서 서비스를 다시 시작하는 작업을 실행합니다.

+0

@techraf 감사합니다! 대답은 도움이되며 솔루션은 테스트를 거쳐 작동합니다. – user3155618

0

귀하의 처리기가 무엇을해야하는지 명확하지 않습니다. 어쨌든, 처리기 official documentation 관해서

가 재생 태스크의 각 블록의 단부에 트리거, 및 은 상이한 작업 통지 되더라도 한번 트리거 될 ...]로 2.2 핸들러는 일반적인 주제를 "청취"할 수 있으며 다음과 같이 태스크가 해당 주제를 알릴 수 있습니다.

핸들러는 각 태스크 블록에 대해 한 번씩 통지/실행됩니다. "모든"대상 호스트 후에 처리기를 유지하는 것이 목표 일 수는 있지만 핸들러를 깨끗하게 사용하는 것처럼 보이지는 않습니다. .

+0

처리기가 "모든"대상 호스트에 대한 재생에만 포함되는 경우 다른 재생 장치에서 알림을 받으면 실행되지 않습니다. – user3155618

+0

당신 말이 맞아요. 하지만 "handlers/main.yml"이하는 일은 무엇입니까? – gile

+0

원래 질문을 수정했습니다. 게시물의 "handlers/main.yml"내용을 참조하십시오. – user3155618