![Ansible 获取认证文件列表并检查其过期日期](https://linux22.com/image/156532/Ansible%20%E8%8E%B7%E5%8F%96%E8%AE%A4%E8%AF%81%E6%96%87%E4%BB%B6%E5%88%97%E8%A1%A8%E5%B9%B6%E6%A3%80%E6%9F%A5%E5%85%B6%E8%BF%87%E6%9C%9F%E6%97%A5%E6%9C%9F.png)
我试图弄清楚如何.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"
最后附注:我真的不明白为什么你需要两次日期检查。由于您认为任何日期失败都会导致证书无效,因此检查最远的证书就足够了。我在示例中保留了所有测试,以便您知道如何在我遗漏的情况下进行修改。