Certificates

Ansible 獲取認證文件列表並檢查其到期日期

  • February 24, 2022

我試圖弄清楚如何.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"

最後附註:我真的不明白為什麼您需要兩次日期檢查。由於您認為任何日期失敗都會使證書無效,因此檢查最遠的日期就足夠了。我在範例中保留了所有測試,因此如果我遺漏了某些內容,您知道如何修改它。

引用自:https://unix.stackexchange.com/questions/528489