Ansible은 인증 파일 목록을 가져오고 만료 날짜를 확인합니다.

Ansible은 인증 파일 목록을 가져오고 만료 날짜를 확인합니다.

저는 우리 웹 서버 중 하나에서 파일 목록을 가져오고 이러한 인증 파일의 만료 날짜를 확인하는 방법을 알아내려고 노력 중입니다 .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"

최종 참고 사항: 왜 날짜 확인이 두 번 필요한지 이해가 되지 않습니다. 날짜 오류로 인해 인증서가 무효화될 것이라고 가정하므로 가장 먼 인증서를 확인하는 것으로 충분합니다. 예제에 모든 테스트를 보관했기 때문에 뭔가를 놓친 경우 수정하는 방법을 알 수 있습니다.

관련 정보