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 除外)的通過/失敗消息的任何建議?
好的……我花了一段時間才弄清楚為什麼你的調試結果與我的測試不一致。你有一個錯誤:
- 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"
最後附註:我真的不明白為什麼您需要兩次日期檢查。由於您認為任何日期失敗都會使證書無效,因此檢查最遠的日期就足夠了。我在範例中保留了所有測試,因此如果我遺漏了某些內容,您知道如何修改它。