В собственной оболочке bash
, установленной на macOS
Терминале (версии 4 по крайней мере ), включите опцию расширенного шаблона globstar
, чтобы включить рекурсивное сопоставление шаблона во вложенных подкаталогах -.
shopt -s globstar nullglob
printf '%s\n' **/*.pdf
Параметр nullglob
предотвращает расширение шаблонов имен файлов, которые не соответствуют файлам, в нулевую строку, а не в самих себя. С globstar
шаблон **
, используемый в контексте расширения имени файла, будет соответствовать всем файлам и нулю или более каталогам и подкаталогам -.
Чтобы немного обезопасить себя, не устанавливая параметры оболочки в текущей оболочке, вы можете вместо этого установить ее в оболочке sub -
( shopt -s globstar nullglob; printf '%s\n' **/*.pdf ; )
Хорошо... мне потребовалось некоторое время, чтобы понять, почему ваш результат отладки не соответствует моим тестам. У вас там ошибка:
- 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 }}"
Вышеупомянутое должно выполнить задание :assert будет выполняться для каждого результата информации о сертификате, и playbook завершится с ошибкой, если какая-либо из проверок не соответствует требованиям.
Однако результат может быть немного трудночитаемым. Я бы сделал это немного по-другому, чтобы получить лучший результат:
- 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"
Последнее примечание :Я действительно не понимаю, зачем нужны две проверки даты. Поскольку вы считаете, что любой сбой даты делает сертификат недействительным, проверки самого дальнего должно быть достаточно. Я сохранил все тесты в своих примерах, чтобы вы знали, как их изменить, если я что-то упустил.