Python3.6/Ansible2.9下带Z的时间字符串转时间戳报错解决方案
解决Python 3.6.8+Ansible 2.9.25中UTC/Zulu格式日期转时间戳的兼容问题
问题根源
旧版本Python(3.6.x)的datetime.strptime不支持用%z匹配Z(UTC+0的标识),仅能识别±HHMM格式的时区偏移;而高版本Python(3.11+)才新增了Z作为%z的匹配项。Ansible的to_datetime过滤器底层依赖Python的datetime模块,因此旧环境会出现格式不匹配的报错。
解决方案
方案1:预处理字符串适配旧Python版本
通过字符串替换,将日期末尾的Z替换为+0000(标准UTC时区偏移格式),再使用原格式串转换:
- name: 转换证书过期日期为时间戳 set_fact: cert_exp_timestamp: >- {{ (cert_exp_full | replace('Z', '+0000') | to_datetime('%Y%m%d%H%M%S%z')).strftime('%s') }}
该方法纯Ansible过滤器实现,跨平台,无需依赖系统命令。
方案2:借助系统date命令规避Python版本差异
如果目标机器为Linux系统,可直接用date命令处理(GNU date原生支持识别Z结尾的UTC格式):
- name: 用date命令转换日期为时间戳 command: date -d "{{ cert_exp_full }}" +%s register: cert_exp_timestamp_result - set_fact: cert_exp_timestamp: "{{ cert_exp_timestamp_result.stdout }}"
该方法不依赖Python版本,但仅适用于类Unix系统,且需确保date命令支持-d参数。
内容的提问来源于stack exchange,提问作者d1530
相关产品推荐
相关产品推荐

