저는 우리 웹 서버 중 하나에서 파일 목록을 가져오고 이러한 인증 파일의 만료 날짜를 확인하는 방법을 알아내려고 노력 중입니다 .crt
(실제로 이 인증서가 특정 기간 내에 유효한지 확인). 지금까지 내가 가지고 있는 것은 다음 .yml
플레이북 코드입니다.
#
# simple playbook to check certificates expiration date
- name: find cerfication files & expiration dates
hosts: 10.0.1.120
gather_facts: false
tasks:
- name: Find cert files under /etc/pki/tls/certs
find:
paths: /etc/pki/tls/certs
file_type: file
patterns: "*.crt"
recurse: yes
excludes: "localhost.crt"
register: find_result
- name: check validity
openssl_certificate_info:
path: "{{ item.path }}"
valid_at:
point_1: "+1w"
point_2: "+10w"
register: result
loop: "{{ find_result.files|flatten(levels=1) }}"
#- name: validate
#assert:
#that:
#- result.valid_at.point_1
#- result.valid_at.point_2
- debug: msg= "{{ result }}"
위의 결과는 debug msg
다음과 같습니다.
TASK [debug] ****************************************************************************
ok: [10.0.1.120] => {
"msg": ""
}
모듈을 사용하여 얻은 다른 출력을 assert
확인하고 각 결과(point_1 및 point_2)에 대한 통과/실패 메시지를 얻을 수도 있도록 모듈에 설명을 남겼습니다 . 하드코딩된 경로를 assert
제공 .crt
하고 루프를 제공하지 않으면 원하는 시험을 얻을 수 있지만 loop
명령을 사용하려고 하면 assert
모듈이 예상대로 실행되지 않고 dict object
다음과 같은 오류가 발생합니다.
fatal: [10.0.1.120]: FAILED! => {"msg": "The conditional check 'result.valid_at.point_1' failed. The error was: error while evaluating conditional (result.valid_at.point_1): 'dict object' has no attribute 'valid_at'"}
내 Ansible 호스팅 서버에 대한 추가 정보:
- 서버 배포: CentOS-7
- 앤서블 버전: 2.8.1
그럼 여러분, 경로(localhost.crt 제외) .crt
에서 찾을 수 있는 모든 파일 /etc/pki/tls/certs
에 대해 내가 원하는 통과/실패 메시지를 얻기 위해 이 루프를 올바르게 실행하는 방법에 대한 제안 사항이 있습니까 ?
답변1
음... 디버깅 결과가 내 테스트와 일치하지 않는 이유를 알아내는 데 시간이 좀 걸렸습니다. 거기에 오류가 있습니다:
- debug: msg= "{{ result }}"
(사라지는 공간에 주목)
- debug: msg="{{ result }}"
또는 더 나은 방법(향후 디버깅 지옥을 위해 전체 yaml 구문을 채택)
- debug:
msg: "{{ result }}"
이제 문제가 해결되었으므로 문제가 result.someWhateverCertValue
존재하지 않는다는 것을 분명히 알 수 있습니다. 인증서 정보 작업에서 루프를 사용했기 때문에 각 개별 모듈 실행이 목록에 보고됩니다.result.results[]
여전히 를 사용하려면 assert
각 결과에 대해 다시 반복해야 합니다.
- name: validate
assert:
that:
- item.valid_at.point_1 | bool
- item.valid_at.point_2 | bool
loop: "{{ result.results }}"
위의 코드는 작업을 수행해야 합니다. 어설션은 각 인증서 정보 결과에 대해 실행되며 검사 중 하나라도 요구 사항을 충족하지 않으면 플레이북이 실패하고 종료됩니다.
그러나 결과를 읽기가 다소 어려울 수 있습니다. 더 나은 결과를 얻으려면 약간 다르게 수행하겠습니다.
- name: find cerfication files & expiration dates
hosts: my_host
gather_facts: false
tasks:
- name: Find cert files under /etc/pki/tls/certs
find:
paths: /etc/pki/tls/certs
file_type: file
patterns: "*.crt"
recurse: yes
excludes: "localhost.crt"
register: find_result
- name: Check validity
openssl_certificate_info:
path: "{{ item.path }}"
valid_at:
point_1: "+1w"
point_2: "+10w"
register: cert_info
loop: "{{ find_result.files }}"
- name: Filter out valid certs
set_fact:
outdated_certs: "{{ cert_info | json_query('results[? !(valid_at.point_1) || !(valid_at.point_2)]') }}"
- block:
- name: Check that all certificates are valid
assert:
that:
- outdated_certs | count == 0
rescue:
- name: Show info about outdated certs
debug:
msg: >-
{{ { "Outdated Certs": outdated_certs | json_query("[].item.path") } }}
- fail:
msg: "Outdated certs found. See list above"
최종 참고 사항: 왜 날짜 확인이 두 번 필요한지 이해가 되지 않습니다. 날짜 오류로 인해 인증서가 무효화될 것이라고 가정하므로 가장 먼 인증서를 확인하는 것으로 충분합니다. 예제에 모든 테스트를 보관했기 때문에 뭔가를 놓친 경우 수정하는 방법을 알 수 있습니다.