如何将win_service_info结果转小写,实现服务路径不区分大小写匹配?
解决Ansible中Windows服务路径不区分大小写匹配的问题
问题根源
你的脚本存在两个核心错误:
- 直接对
services注册变量使用| lower过滤器,会把整个字典结构转成字符串,而非仅将服务路径转为小写,导致后续selectattr无法识别服务对象的属性。 - 未正确引用服务列表字段:
win_service_info返回的注册变量里,实际服务列表存储在services.services键下,直接使用services变量是错误的。
解决方案
无需预先转换所有服务数据的大小写,只需在匹配时分别对服务路径和用户输入路径做小写转换即可。推荐用lambda函数在筛选逻辑中直接完成大小写统一,写法简洁高效。
修正后的Playbook
- name: 获取Windows服务信息 ansible.windows.win_service_info: register: services - name: 根据安装路径定位目标服务(不区分大小写) set_fact: target_service: "{{ services.services | select(lambda s: s.path | lower == SchedulerPath | lower) | first }}" when: services.services | select(lambda s: s.path | lower == SchedulerPath | lower) | list | length > 0
替代兼容方案(无Lambda依赖)
如果你的Ansible版本不支持lambda函数,可以通过loop和combine为每个服务添加小写路径属性后再筛选:
- name: 获取Windows服务信息 ansible.windows.win_service_info: register: services - name: 为每个服务添加小写路径属性 set_fact: services_with_lower_path: "{{ services_with_lower_path | default([]) + [item | combine({'lower_path': item.path | lower})] }}" loop: "{{ services.services }}" loop_control: label: "{{ item.name }}" - name: 定位目标服务 set_fact: target_service: "{{ services_with_lower_path | selectattr('lower_path', 'equalto', SchedulerPath | lower) | first }}" when: services_with_lower_path | selectattr('lower_path', 'equalto', SchedulerPath | lower) | list | length > 0
内容的提问来源于stack exchange,提问作者Jason Garner
相关产品推荐
相关产品推荐

