본문 바로가기

클라우드/앤서블(Ansible)

앤서블 Ansible 작업 제어 6 / 작업 오류 처리

# 작업 오류 처리

앤서블에서는 return code (rc) 가 0이어야만 정상적으로 실행이 되었다고 판별한다.

리턴코드가 0이 아니거나 작업에서 오류를 수신하면 해당 호스트에서 해당 작업 및 후속 작업을 중지하고 다른 호스트가 있다면 다른 호스트에서 작업을 계속 실행한다. 그러나 드문경우 rc가 0이 아니어도 정상적으로 작동한것일수있다. 오류를 처리하는 방법이 여러가지 있다.

 

# 실패한 명령 무시

명령 (command 모듈) 작업이 실패하더라도 ignore_errors 키워드로 무시할 수 있다.

리턴코드가 0이 아니라도 다음작업으로 넘어간다.

 

 

# 연결 할 수 없는 호스트 무시

ssh연결이 안되어 관리노드에 연결 할 수 없는 unreachable 상태인 경우 ignore_unreachable 키워드로 작업 실패를 무시 할 수 있다. 후속 작업은 해당 관리 노드에서 계속 실행된다.

 

 

# 핸들러의 실패

직접 플레이북에 설정하지 않더라도 핸들러를 강제로 실행 할 수 있다.

ansible.cfg 에 설정하면 모든 플레이북에 적용되므로 권장하지 않는다.

 

 

# 실패 재정의

실패에 대해서 사용자가 정의를 재정의 한다. 커맨드 모듈(예시에 있는것은 실제 존재하지않는 명령어)을 등록변수로 등록을 시켰다 (command_result) . failed_when 실패할 조건을 지정한다. command_result라는 변수에 stderr(표준오류)에 failed라는 글자가 있으면 실패로 간주한다.

 

 

# 변경상태 재정의

changed_when 어떤 조건을 주고, 조건을 만족하면 changed 상태로 만든다. 명령어를 실행해서 그 결과를 저장, 그 결과의 return code가 2번이 아니면 변경처리하라 ( 핸들러의 트리거 역할을 하기위해  changed 상태로 보고하라)

 

 

# command 및 shell 모듈 작업의 성공 보장

command 또는 shell 모듈을 무조건 성공하게한다. 명령어를 실행 할 때 이 명령어가 성공할수도있고 실패할수도있다. 앞의 명령어가 실행에 성공하면 뒤의 명령어는 실행 되지 않는다. 앞의 명령어가 실패하면 뒤에 명령어는 실행된다.

|| (or)

&& 앞이 실행되어야만 뒤에도 실행

 

 

# 모든 호스트 작업 중단

#첫번째 오류에서 중단

예시1) 워드프레스를 mgmt 그룹에 배포한다고 가정하면, 101번 102번에 똑같은 작업을 배포한다. 작업이 10개가 있는데 101번은 2번 작업에서 실패하고 102번은 2번작업에서 성공하였다면 101번은 배포를 멈추고 102번은 계속 진행할것이다. any_errors_fatal: true 를 설정하면 하나의 노드만 실패하게 되면 전부 중단시킨다.

예시2) kubespray로 kubenetes를 배포한다고 가정하면, 컨트롤 플레인 작업을 하다가 오류가 나면 모든 노드 작업을 중단시킨다.

 

# 최대 실패율 설정

max_fail_percentage: 30

serial: 10

시스템이 10대가 있는데 한대가 오류나서 전체시스템을 중단하는것은 비효율적, 비율을 지정할 수 있다. 30% 가 오류가 나면 전체를 중단한다 (전체 10대면 3대 오류)

 

 

더보기

- name: Do not count thid as a failure
  command: /bin/false
  ignore_errors: yes
  
  
- name: This executes, fails, and the failure is ignored
  command: /bin/true
  ignore_unreachable: yes
  
- name: This executes, fails, and ends the play for this host
  commmand: /bin/true
  

  force_handlers = True                # ansible.cfg
  force_handlers: true                 # play
  ansible-playbook --force-handlers    # command
  
  
- name: Fail task when the command error output prints FAILED
  command: /usr/bin/example-command -x -y -z
  register: command_result
  failed_when: "'FAILED' in command_result.stderr"
  
  
  tasks:
    - name: Report 'changed' when the return code is not equal to 2
      shell: /usr/bin/dillybass --mode="take me to river"
      register: bass_result
      changed_when: "bass_result.rc !=2"
      
    - name: This will never report 'changed' status
      shell: wall 'beep'
      changed_when: False
      
 tasks:
   - name: Run this command and ignore the result
     shell: /usr/bin/somecommand || /bin/true