Ansible:如何从字典列表中保留各域名最新过期时间的条目?
Ansible 筛选字典列表:保留每个域名最新过期的证书
完全可以用Ansible内置过滤器实现,不需要自定义过滤器或循环,核心思路是先按域名分组,再在每组内筛选过期时间最晚的条目。
实现示例
--- - name: 筛选每个域名最新的ACM证书 hosts: localhost vars: acm_certificates: - domain_name: "example.com" not_after: "2024-07-31T01:59:59+02:00" - domain_name: "example2.com" not_after: "2024-07-31T01:59:59+02:00" - domain_name: "example.com" not_after: "2023-07-15T01:59:59+02:00" tasks: - name: 处理证书列表,保留每个域名最新条目 set_fact: latest_certificates: > {{ acm_certificates | groupby('domain_name') | map('last') | map('sort', attribute='not_after', reverse=true) | map('first') | list }} - name: 输出筛选结果 debug: var: latest_certificates
过滤器拆解说明
每个过滤器的作用依次是:
groupby('domain_name'):将原列表按domain_name分组,得到(域名, [该域名的所有证书条目])格式的元组列表map('last'):提取每个分组中的证书条目列表(丢弃分组的域名键)map('sort', attribute='not_after', reverse=true):对每个分组的条目按not_after倒序排序(最新过期时间排在首位)map('first'):取每个排序后列表的第一个元素,即该域名过期时间最晚的证书list:将最终的迭代器转换为标准列表格式
注意事项
not_after字段的ISO时间字符串可以直接比较大小,Ansible会自动识别时间顺序,无需额外转换为时间对象。
内容的提问来源于stack exchange,提问作者SipSeb
相关产品推荐
相关产品推荐

