Преобразование времени ⇐ Python
-
Anonymous
Преобразование времени
Я пытаюсь преобразовать дату истечения срока действия сертификата в формате %Y%m%d%H%M%S%Z в эпоху, которая будет использоваться для сравнения с другой дата, полученная из хранилища ключей Java. Чтобы сделать это довольно простым (поскольку даты сертификатов — UTC/Zulu, а хранилище ключей Java находится в CST), я решил преобразовать даты в UTC и эпоху, чтобы сравнить их позже в своей книге. Однако я получаю сообщение об ошибке, сообщающее, что мою переменную невозможно преобразовать в словарь.
Вот задачи для сертификата до момента возникновения ошибки.
- name: Проверка наличия сертификата сервера ansible.builtin.stat: путь: /opt/ssl/{{ ansible_facts['hostname'] }}.crt зарегистрироваться: файл_сертификата тэги: отладка - имя: завершить игру, если сертификат не найден. ansible.builtin.assert: что: - cert_file.stat.exists == true fail_msg: Сертификат сервера не найден. тэги: отладка - имя: найти файлы сертификатов в /opt/ssl. ansible.builtin.find: пути: /opt/ssl тип_файла: файл шаблоны: "*.crt" рекурсия: правда зарегистрироваться: find_result тэги: сертификат когда: cert_file.stat.exists == true - имя: Сбор информации о сертификате openssl_certificate_info: путь: "{{ item.path }}" зарегистрироваться: cert_info цикл: "{{ find_result.files }}" тэги: сертификат когда: cert_file.stat.exists == true - имя: отладка cert_info отлаживать: сообщение: "{{ cert_info }}" - имя: Установить полный факт истечения срока действия сертификата. ansible.builtin.set_fact: cert_exp_full: "{{ item.not_after }}" цикл: "{{ cert_info.results }}" цикл_контроля: label: "{{ item.subject.commonName}}" тэги: сертификат когда: cert_file.stat.exists == true - имя: отладка отлаживать: сообщение: "{{ cert_exp_full }}" - имя: Преобразовать в эпоху | Время указано в формате UTC/Зулу. ansible.builtin.set_fact: cert_epoch: "{{ (cert_exp_full | to_datetime('%Y%m%d%H%M%S%z')).strftime('%s') }}" тэги: сертификат когда: cert_file.stat.exists == true Тогда результат будет следующим:
ИГРАТЬ [все] **************************************** **************************************************** **************************************************** **************************************************** ******************* ЗАДАНИЕ [Сбор фактов] ********************************************** **************************************************** **************************************************** **************************************************** ** ок: [dtest08] ЗАДАЧА [сертификаты: проверка наличия сертификата сервера] **************************************** **************************************************** **************************************************** ******************************** ок: [dtest08] ЗАДАЧА [сертификаты: завершить игру, если сертификат не найден.] ************************************* **************************************************** **************************************************** ************************************* ок: [dtest08] => изменено = ложь сообщение: все утверждения пройдены ЗАДАЧА [сертификаты: найти файлы сертификатов в /opt/ssl] ************************************* **************************************************** **************************************************** ************************************* ок: [dtest08] ЗАДАЧА [сертификаты: собрать информацию о сертификате] ******************************************* **************************************************** **************************************************** ********************************************** ок: [dtest08] => (item={'path': '/opt/ssl/dtest08.crt', 'mode': '0644', 'isdir': False, 'ischr': False, 'isblk': False, 'isreg': True, 'isfifo': False, 'islnk': False, 'issock': False, 'uid': 0, 'gid': 0, 'size': 1253, 'inode': 34241578, 'dev': 64768, 'nlink': 1, 'atime': 1704382642.2240086, 'mtime': 1675972923.0, 'ctime': 1701979001.5420384, 'gr_name': 'root', 'pw_name': 'root', 'wusr': Правда, «rusr»: правда, «xusr»: ложь, «wgrp»: ложь, «rgrp»: правда, «xgrp»: ложь, «woth»: ложь, «roth»: правда, «xoth»: ложь, 'isuid': Ложь, 'isgid': Ложь}) ЗАДАЧА [сертификаты: отладка cert_info] ******************************************* **************************************************** **************************************************** ********************************************** ок: [dtest08] => сообщение: изменено: ложь сообщение: Все пункты выполнены Результаты: - ansible_loop_var: элемент Authority_cert_issuer: ноль Authority_cert_serial_number: ноль Authority_key_identifier: ноль Basic_constraints: ноль Basic_constraints_critical: ложь изменено: ложь истек: ложь Extended_key_usage: ноль расширенный_key_usage_critical: ложь Extensions_by_oid: {} не удалось: ложь вызов: модуль_аргс: путь: /opt/ssl/dtest08.crt select_crypto_backend: авто valid_at: ноль эмитент: общее имя: dtest СтранаНазвание: США Адрес электронной почты: dthiel@acuity.com населенный пунктНазвание: Шебойган Название организации: Default Company Ltd. StateOrProvinceName: Висконсин Issuer_ordered: - - Имя страны - НАС - -stateOrProvinceName - Висконсин - - имя_локации - Шебойган - - Название организации - Компания по умолчанию, ООО - - распространенное имя - dtest - - Адрес электронной почты - dthiel@acuity.com элемент: время: 1704382642.2240086 время: 1701979001.5420384 Разработчик: 64768 гид: 0 имя_группы: корень индекс: 34241578 исблк: ложь ишр: ложь Исдир: ложь исфифо: ложь исгид: ложь ислнк: ложь исрег: правда иссок: ложь исуид: ложь режим: '0644' время: 1675972923.0 ссылка: 1 путь: /opt/ssl/dtest08.crt pw_name: корень ргрп: правда Рот: правда руср: правда размер: 1253 пользовательский идентификатор: 0 вгрп: ложь что: ложь вуср: правда xgrp: ложь ксот: ложь ксуср: ложь key_usage: ноль key_usage_critical: ложь not_after: 20240209200203Z not_before: 20230209200203Z ocsp_must_staple: ноль ocsp_must_staple_critical: ложь ocsp_uri: ноль открытый_ключ: |- -----НАЧАТЬ ПУБЛИЧНЫЙ КЛЮЧ----- -----КОНЕЦ ПУБЛИЧНОГО КЛЮЧА----- public_key_fingerprints: blake2b: blake2s: md5: sha1: sha224: sha256: sha384: sha3_224: sha3_256: sha3_384: sha3_512: sha512: shake_128: shake_256: серийный_номер: Signature_algorithm: sha256WithRSAEncryption предмет: общее имя: dtest08 СтранаНазвание: США населенный пунктНазвание: Шебойга Название организации: Default Company Ltd. StateOrProvinceName: Висконсин subject_alt_name: ноль subject_alt_name_critical: ложь subject_key_identifier: ноль subject_ordered: - - Имя страны - НАС - -stateOrProvinceName - Висконсин - - имя_локации - Шебойга - - Название организации - Компания по умолчанию, ООО - - распространенное имя - dtest08 valid_at: {} версия: 1 ЗАДАЧА [сертификаты: Установить факт окончания срока действия сертификата] **************************************** **************************************************** **************************************************** **** ок: [dtest08] => (item=dtest08) ЗАДАЧА [сертификаты: отладка] ********************************************** **************************************************** **************************************************** **************************************************** ***** ок: [dtest08] => сообщение: 20240209200203Z ЗАДАЧА [сертификаты: Преобразовать в эпоху | Время указано в формате UTC/Зулу] ******************************************* **************************************************** **************************************************** ********************* фатальный: [dtest08]: НЕ ПРОШЛО! => сообщение: |- поле 'args' имеет недопустимое значение ({'cert_epoch': "{{ (cert_exp_full | to_datetime('%Y%m%d%H%M%S%z')).strftime('%s') } }"}), и его не удалось преобразовать в dict. Ошибка: данные времени '20240209200203Z' не соответствуют формату '%Y%m%d%H%M%S%z' Кажется, ошибка находится в «/root/ansible/certs/roles/certs/tasks/main.yml»: строка 49, столбец 3, но может находиться в другом месте файла в зависимости от конкретной синтаксической проблемы. Оскорбительная строка выглядит так: - имя: Преобразовать в эпоху | Время указано в формате UTC/Зулу. ^ здесь Другой элемент, который может вызвать мою проблему, — это версия Python и Ansible, которую мне необходимо использовать.
# ansible --version доступный 2.9.25 файл конфигурации = /etc/ansible/ansible.cfg путь поиска настроенного модуля = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules'] расположение модуля ansible python = /usr/lib/python3.6/site-packages/ansible расположение исполняемого файла = /usr/bin/ansible версия Python = 3.6.8 (по умолчанию, 14 июня 2022 г., 12:54:58) [GCC 8.5.0 20210514 (Red Hat 8.5.0-10)] На локальном сервере с ansible v2.15.4 и python3.11 это работает.
Как преодолеть эту ошибку с помощью ansible 2.9.25 и python 3.6? Я предполагаю, что это проблема синтаксиса, о которой я не знаю (я не очень хорошо владею Python). Заранее спасибо.
Я пытаюсь преобразовать дату истечения срока действия сертификата в формате %Y%m%d%H%M%S%Z в эпоху, которая будет использоваться для сравнения с другой дата, полученная из хранилища ключей Java. Чтобы сделать это довольно простым (поскольку даты сертификатов — UTC/Zulu, а хранилище ключей Java находится в CST), я решил преобразовать даты в UTC и эпоху, чтобы сравнить их позже в своей книге. Однако я получаю сообщение об ошибке, сообщающее, что мою переменную невозможно преобразовать в словарь.
Вот задачи для сертификата до момента возникновения ошибки.
- name: Проверка наличия сертификата сервера ansible.builtin.stat: путь: /opt/ssl/{{ ansible_facts['hostname'] }}.crt зарегистрироваться: файл_сертификата тэги: отладка - имя: завершить игру, если сертификат не найден. ansible.builtin.assert: что: - cert_file.stat.exists == true fail_msg: Сертификат сервера не найден. тэги: отладка - имя: найти файлы сертификатов в /opt/ssl. ansible.builtin.find: пути: /opt/ssl тип_файла: файл шаблоны: "*.crt" рекурсия: правда зарегистрироваться: find_result тэги: сертификат когда: cert_file.stat.exists == true - имя: Сбор информации о сертификате openssl_certificate_info: путь: "{{ item.path }}" зарегистрироваться: cert_info цикл: "{{ find_result.files }}" тэги: сертификат когда: cert_file.stat.exists == true - имя: отладка cert_info отлаживать: сообщение: "{{ cert_info }}" - имя: Установить полный факт истечения срока действия сертификата. ansible.builtin.set_fact: cert_exp_full: "{{ item.not_after }}" цикл: "{{ cert_info.results }}" цикл_контроля: label: "{{ item.subject.commonName}}" тэги: сертификат когда: cert_file.stat.exists == true - имя: отладка отлаживать: сообщение: "{{ cert_exp_full }}" - имя: Преобразовать в эпоху | Время указано в формате UTC/Зулу. ansible.builtin.set_fact: cert_epoch: "{{ (cert_exp_full | to_datetime('%Y%m%d%H%M%S%z')).strftime('%s') }}" тэги: сертификат когда: cert_file.stat.exists == true Тогда результат будет следующим:
ИГРАТЬ [все] **************************************** **************************************************** **************************************************** **************************************************** ******************* ЗАДАНИЕ [Сбор фактов] ********************************************** **************************************************** **************************************************** **************************************************** ** ок: [dtest08] ЗАДАЧА [сертификаты: проверка наличия сертификата сервера] **************************************** **************************************************** **************************************************** ******************************** ок: [dtest08] ЗАДАЧА [сертификаты: завершить игру, если сертификат не найден.] ************************************* **************************************************** **************************************************** ************************************* ок: [dtest08] => изменено = ложь сообщение: все утверждения пройдены ЗАДАЧА [сертификаты: найти файлы сертификатов в /opt/ssl] ************************************* **************************************************** **************************************************** ************************************* ок: [dtest08] ЗАДАЧА [сертификаты: собрать информацию о сертификате] ******************************************* **************************************************** **************************************************** ********************************************** ок: [dtest08] => (item={'path': '/opt/ssl/dtest08.crt', 'mode': '0644', 'isdir': False, 'ischr': False, 'isblk': False, 'isreg': True, 'isfifo': False, 'islnk': False, 'issock': False, 'uid': 0, 'gid': 0, 'size': 1253, 'inode': 34241578, 'dev': 64768, 'nlink': 1, 'atime': 1704382642.2240086, 'mtime': 1675972923.0, 'ctime': 1701979001.5420384, 'gr_name': 'root', 'pw_name': 'root', 'wusr': Правда, «rusr»: правда, «xusr»: ложь, «wgrp»: ложь, «rgrp»: правда, «xgrp»: ложь, «woth»: ложь, «roth»: правда, «xoth»: ложь, 'isuid': Ложь, 'isgid': Ложь}) ЗАДАЧА [сертификаты: отладка cert_info] ******************************************* **************************************************** **************************************************** ********************************************** ок: [dtest08] => сообщение: изменено: ложь сообщение: Все пункты выполнены Результаты: - ansible_loop_var: элемент Authority_cert_issuer: ноль Authority_cert_serial_number: ноль Authority_key_identifier: ноль Basic_constraints: ноль Basic_constraints_critical: ложь изменено: ложь истек: ложь Extended_key_usage: ноль расширенный_key_usage_critical: ложь Extensions_by_oid: {} не удалось: ложь вызов: модуль_аргс: путь: /opt/ssl/dtest08.crt select_crypto_backend: авто valid_at: ноль эмитент: общее имя: dtest СтранаНазвание: США Адрес электронной почты: dthiel@acuity.com населенный пунктНазвание: Шебойган Название организации: Default Company Ltd. StateOrProvinceName: Висконсин Issuer_ordered: - - Имя страны - НАС - -stateOrProvinceName - Висконсин - - имя_локации - Шебойган - - Название организации - Компания по умолчанию, ООО - - распространенное имя - dtest - - Адрес электронной почты - dthiel@acuity.com элемент: время: 1704382642.2240086 время: 1701979001.5420384 Разработчик: 64768 гид: 0 имя_группы: корень индекс: 34241578 исблк: ложь ишр: ложь Исдир: ложь исфифо: ложь исгид: ложь ислнк: ложь исрег: правда иссок: ложь исуид: ложь режим: '0644' время: 1675972923.0 ссылка: 1 путь: /opt/ssl/dtest08.crt pw_name: корень ргрп: правда Рот: правда руср: правда размер: 1253 пользовательский идентификатор: 0 вгрп: ложь что: ложь вуср: правда xgrp: ложь ксот: ложь ксуср: ложь key_usage: ноль key_usage_critical: ложь not_after: 20240209200203Z not_before: 20230209200203Z ocsp_must_staple: ноль ocsp_must_staple_critical: ложь ocsp_uri: ноль открытый_ключ: |- -----НАЧАТЬ ПУБЛИЧНЫЙ КЛЮЧ----- -----КОНЕЦ ПУБЛИЧНОГО КЛЮЧА----- public_key_fingerprints: blake2b: blake2s: md5: sha1: sha224: sha256: sha384: sha3_224: sha3_256: sha3_384: sha3_512: sha512: shake_128: shake_256: серийный_номер: Signature_algorithm: sha256WithRSAEncryption предмет: общее имя: dtest08 СтранаНазвание: США населенный пунктНазвание: Шебойга Название организации: Default Company Ltd. StateOrProvinceName: Висконсин subject_alt_name: ноль subject_alt_name_critical: ложь subject_key_identifier: ноль subject_ordered: - - Имя страны - НАС - -stateOrProvinceName - Висконсин - - имя_локации - Шебойга - - Название организации - Компания по умолчанию, ООО - - распространенное имя - dtest08 valid_at: {} версия: 1 ЗАДАЧА [сертификаты: Установить факт окончания срока действия сертификата] **************************************** **************************************************** **************************************************** **** ок: [dtest08] => (item=dtest08) ЗАДАЧА [сертификаты: отладка] ********************************************** **************************************************** **************************************************** **************************************************** ***** ок: [dtest08] => сообщение: 20240209200203Z ЗАДАЧА [сертификаты: Преобразовать в эпоху | Время указано в формате UTC/Зулу] ******************************************* **************************************************** **************************************************** ********************* фатальный: [dtest08]: НЕ ПРОШЛО! => сообщение: |- поле 'args' имеет недопустимое значение ({'cert_epoch': "{{ (cert_exp_full | to_datetime('%Y%m%d%H%M%S%z')).strftime('%s') } }"}), и его не удалось преобразовать в dict. Ошибка: данные времени '20240209200203Z' не соответствуют формату '%Y%m%d%H%M%S%z' Кажется, ошибка находится в «/root/ansible/certs/roles/certs/tasks/main.yml»: строка 49, столбец 3, но может находиться в другом месте файла в зависимости от конкретной синтаксической проблемы. Оскорбительная строка выглядит так: - имя: Преобразовать в эпоху | Время указано в формате UTC/Зулу. ^ здесь Другой элемент, который может вызвать мою проблему, — это версия Python и Ansible, которую мне необходимо использовать.
# ansible --version доступный 2.9.25 файл конфигурации = /etc/ansible/ansible.cfg путь поиска настроенного модуля = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules'] расположение модуля ansible python = /usr/lib/python3.6/site-packages/ansible расположение исполняемого файла = /usr/bin/ansible версия Python = 3.6.8 (по умолчанию, 14 июня 2022 г., 12:54:58) [GCC 8.5.0 20210514 (Red Hat 8.5.0-10)] На локальном сервере с ansible v2.15.4 и python3.11 это работает.
Как преодолеть эту ошибку с помощью ansible 2.9.25 и python 3.6? Я предполагаю, что это проблема синтаксиса, о которой я не знаю (я не очень хорошо владею Python). Заранее спасибо.
Мобильная версия