Ansible异步执行yum后变量未定义?SplunkForwarder更新检测失败
Ansible异步执行yum模块后无法访问changes/results字段的原因及解决办法
核心原因分析
异步任务返回结构与同步模式完全不同:
当开启poll:0异步执行时,Ansible不会等待任务完成,只会返回一个异步任务元数据对象,里面仅包含ansible_job_id、started、finished这类任务状态标识字段,根本没有yum模块本身的changes或results输出。而check_mode是模拟执行,不会触发真正的后台异步任务,返回的是同步模式下的完整模块结果,因此能正常获取changes字段。RHEL7与RHEL8的Ansible版本差异:
RHEL7默认搭载的Ansible版本普遍较低(如2.9系列),RHEL8则通常配备更高版本(如2.12+)。不同版本对异步任务结果的结构处理有差异,老版本不会在元数据中嵌套模块结果,新版本结构更规范,但核心问题一致:必须通过专门模块获取实际执行结果,不能直接访问原任务的返回值。
解决办法
要获取异步yum任务的真实执行结果,需使用async_status模块查询异步任务的最终输出,具体步骤如下:
- 执行异步yum任务时,注册任务元数据
- 用
async_status轮询任务状态,直到完成并获取真实结果 - 从真实结果中提取
changes或results字段设置fact
示例Playbook代码:
- name: 异步更新splunkforwarder yum: name: splunkforwarder state: latest async: 2000 poll: 0 register: splunk_update_job - name: 等待更新任务完成并获取结果 async_status: jid: "{{ splunk_update_job.ansible_job_id }}" register: splunk_update_result until: splunk_update_result.finished retries: 100 # 根据实际任务时长调整重试次数 delay: 20 # 每20秒轮询一次 - name: 设置splunk更新状态的fact set_fact: splunk_updated7: "{{ splunk_update_result.changes.updated is defined and splunk_update_result.changes.updated | length > 0 }}" splunk_updated8: "{{ splunk_update_result.results is defined and splunk_update_result.results | selectattr('changed', 'equalto', true) | list | length > 0 }}"
通过上述处理,splunk_update_result会变成与同步执行时结构一致的yum模块输出,即可正常访问changes或results字段。
内容的提问来源于stack exchange,提问作者kmuncie
相关产品推荐
相关产品推荐

