使用ansible_date_time.epoch计算日期间隔时报格式不匹配错误
故障根因
报错由两个问题共同导致:
- YAML语法不规范:
debug模块的msg参数写法错误,冒号和值之间缺少必填空格,写成了msg:"{{ ... }}",YAML解析规则要求键值对的冒号后必须跟空格,否则会将整段内容识别为普通字符串,无法转换为模块要求的字典参数结构,对应报错里的could not be converted to an dict提示。 - 时间转换逻辑完全错误:
ansible_date_time.epoch返回值是Unix时间戳(即从1970-01-01 00:00:00 UTC到当前时间的秒数,为纯数字,例如报错里的1655353270),你给to_datetime过滤器传入的%Y-%m-%d %H:%M:%S是「年-月-日 时:分:秒」格式字符串的匹配规则,根本无法解析纯数字时间戳。- 从CSV读取的
svrBuildDate是字符串类型,未转换为datetime时间对象,无法直接参与时间差值计算。
修正后可用的配置
- name: List Server in current play debug: msg: "Item is {{ item }} Build date {{ lookup('csvfile', item + ' file=serverInventory.csv delimiter=, col=5') }}" loop: "{{ ansible_play_batch }}" - name: Calculate days since server build debug: msg: "{{ ((ansible_date_time.epoch | int) - (svrBuildDate | to_datetime('%Y-%m-%d %H:%M:%S')).timestamp()) | int // 86400 }}" vars: svrBuildDate: "{{ lookup('csvfile', inventory_hostname + ' file=serverInventory.csv delimiter=, col=5') }}"
计算逻辑说明
- 将
ansible_date_time.epoch转为整数,获取当前时间的秒级Unix时间戳 - 将CSV读取到的构建日期字符串,通过匹配的
%Y-%m-%d %H:%M:%S格式规则转为datetime对象,再调用timestamp()方法拿到构建时间的秒级Unix时间戳 - 两个时间戳做差得到总间隔秒数,除以单日总秒数86400后取整,即为服务器从构建到当前的间隔天数
- 补全了
msg参数冒号后的空格,符合YAML语法要求
内容的提问来源于stack exchange,提问作者Frosty.Fluffy
相关产品推荐
相关产品推荐

