如何提取Ansible Register输出中的目标数据用于邮件发送?
解决方案
要获取干净的目标数据并用于邮件发送,你需要跳过通过debug模块register多余的任务状态信息,直接处理并存储过滤后的结果:
方法一:先存储过滤后的干净数据(推荐)
修改你的Playbook,用set_fact将过滤后的结果保存为独立变量,后续直接调用这个变量即可:
- name: select hosts: localhost gather_facts: false vars: dict1: [{"a": 1, "b": 2, "c": 3}, {"a": 5, "b": 5, "c": 6},{"a": 8, "b": 9, "c": 10}] tasks: # 过滤数据并存储为变量,转成列表方便后续使用 - set_fact: filtered_data: "{{ dict1 | selectattr('a','ne',1) | selectattr('b','ne',5) | list }}" # 可选:验证过滤结果 - debug: var: filtered_data # 发送邮件,直接引用干净的变量,用to_nice_json格式化排版 - mail: to: "收件人邮箱@example.com" subject: "目标数据" body: "{{ filtered_data[0] | to_nice_json(indent=4) }}"
方法二:直接在邮件任务中处理数据
如果不需要单独存储变量,也可以直接在邮件任务的body参数里完成过滤和格式化:
- name: select hosts: localhost gather_facts: false vars: dict1: [{"a": 1, "b": 2, "c": 3}, {"a": 5, "b": 5, "c": 6},{"a": 8, "b": 9, "c": 10}] tasks: - mail: to: "收件人邮箱@example.com" subject: "目标数据" body: "{{ (dict1 | selectattr('a','ne',1) | selectattr('b','ne',5) | list)[0] | to_nice_json(indent=4) }}"
关键说明
selectattr返回的是生成器对象,需要用| list转成列表才能通过索引([0])取出唯一的字典元素;to_nice_json(indent=4)会把字典格式化为带缩进的美观JSON,和你需要的目标格式一致;- 避免用
debug: var=xxx然后register,因为这种方式会把Ansible任务的状态信息(changed、failed等)和结果绑定在一起,导致数据冗余。
内容的提问来源于stack exchange,提问作者LJS
相关产品推荐
相关产品推荐

