Ansible에서 특정 출력 오류 문자열을 무시하고 성공한 것으로 간주하는 방법

Ansible에서 특정 출력 오류 문자열을 무시하고 성공한 것으로 간주하는 방법

다음 오류 메시지와 함께 플레이북 출력의 특정 오류 메시지를 무시하려고 합니다.

치명적: [192.168.0.1]: 실패했습니다! => {"changed": false, "failed": true, "msg": "SSL/TLS 없이 일반 텍스트로 비밀번호를 보내는 것은 매우 안전하지 않습니다. Query == CHANGE MASTER TO ['MASTER_HOST= %(master_host)s' , 'MASTER_USER=%(master_user)s', 'MASTER_PASSWORD=%(master_password)s', 'MASTER_LOG_FILE=%(master_log_file)s', 'MASTER_LOG_POS=%(master_log_pos)s']"}

> Task: 
> - name: Setup Replication   
    become: true   
    mysql_replication:
>      login_host: "{{ slave_ip }}"
>      login_user: "user"
>      login_password: "***"
>      mode: changemaster
>      master_host: "{{ master_ip }}"
>      master_log_file: mysql-bin.000001
>      master_log_pos: 107
>      master_user: "{{ mysql_replicator_user }}"
>      master_password: "{{ mysql_replicator_password }}"

운이 좋나요? 이 목표를 달성하는 방법은 무엇입니까?

편집: Marco의 답변에 대한 답변 - 좋아요, 그게 문제입니다. 어떤 오류가 발생할지 모르겠습니다. 그러나 오류 메시지에 "SSL 없이 일반 텍스트로 비밀번호 보내기"가 포함되어 있으면 이를 무시하고 다른 오류가 아니라면 무시하지 마십시오. 간단히 설명하자면 "오류 메시지에 -> 'null' 또는 SSL이 포함되어 있지 않으면 예외가 발생합니다."

답변1

Ansible에는 오류 처리를 위한 몇 가지 옵션이 있습니다. ignore_errors: yes작업에서 속성을 사용할 수 있습니다 . 모든 오류를 무시하지 않으려면 다음을 사용하여 정확히 오류를 구성하는 요소를 지정할 수 있습니다.

- name: task name
  module: arguments ...
  register: out
  failed_when: 'error message' in out.stderr 

더 복잡한 실패 검사를 추가하려면 다음과 같이 오류 처리를 별도의 작업으로 분할할 수 있습니다.

- name: test
  shell: echo error; exit 123
  register: out
  ignore_errors: yes

- fail: msg="{{ out.stdout }}"
  when: "out.rc != 0 and 'error' not in out.stdout"

이 예에서 첫 번째 작업은 코드 123으로 실패하고 표준 출력에 "error"를 인쇄합니다. 이는 등록되지만 무시됩니다. 두 번째 작업은 출력 값을 분석하고 반환 코드가 0이 아니고 표준 출력에 "error" 문자열이 포함되지 않은 경우에만 실패합니다.

Ansible 문서에서 자세한 내용을 읽을 수 있습니다.https://docs.ansible.com/ansible/playbooks_error_handling.html

답변2

Ignore_errors가 단순한 예/아니요 확인이 아니기를 진심으로 바랍니다. 이것은 우리의 삶을 훨씬 더 단순하게 만들 것입니다. 최근에 저는 이런 멋진 트릭을 발견했습니다. 이 접근 방식을 사용하면 특정 알려진 출력을 무시할 수 있습니다. 이 예에서는 Sending passwords in plain text without SSL등록된 변수에서 텍스트를 찾고 있습니다 . 텍스트를 찾으면 0으로 평가됩니다. 그런 다음 -1문자열을 찾을 수 없으면 이를 find 함수의 반환 코드와 비교합니다. 왜냐하면 0 == -1궁극적으로 False우리의 상황은failed_when: False

반면에 문자열을 찾을 수 없으면 표현식은 다음과 같습니다. -1 == -1=> failed_when: True모듈의 기본 실패 동작을 재정의하므로 이 방법을 사용할 때 주의하세요. 따라서 종료 코드와 같은 여러 조건을 결합하는 것이 가장 좋습니다.

- name: Risky task
  command: echo "Sending passwords in plain text without SSL"
  register: result
  changed_when: false
  failed_when:
    # returns -1 if string not found
    - result.stdout.find("Sending passwords in plain text without SSL") == -1
    # best to combine additional checks like return code
    - result.rc != 0

result.stdout.find("Sending passwords in plain text without SSL") != 0or 와 같은 것을 사용할 수 있을 것 같지만 '"Sending passwords in plain text without SSL" not in result.stdout'이중 부정문은 이해하기 조금 어려울 것입니다.

관련 정보