다음 오류 메시지와 함께 플레이북 출력의 특정 오류 메시지를 무시하려고 합니다.
치명적: [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") != 0
or 와 같은 것을 사용할 수 있을 것 같지만 '"Sending passwords in plain text without SSL" not in result.stdout'
이중 부정문은 이해하기 조금 어려울 것입니다.