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模块中留下了注释,因此还可以检查我尝试使用该assert模块获得的其他输出,并为每个结果(point_1 和 point_2)获取通过/失败的消息。如果我给出.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
  • Ansible版本:2.8.1

那么,伙计们,关于如何让这个循环正确运行以便为可以在路径.crt下找到的每个文件/etc/pki/tls/certs(除了 localhost.crt)获取我想要的通过/失败消息,有什么建议吗?

答案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"

最后附注:我真的不明白为什么你需要两次日期检查。由于您认为任何日期失败都会导致证书无效,因此检查最远的证书就足够了。我在示例中保留了所有测试,以便您知道如何在我遗漏的情况下进行修改。

相关内容