美好的一天,
我是 Ansible 新手。我正在使用 win_service_info 模块将 Windows 机器的服务放入字典中。但后来我想通过可执行文件的路径搜索特定服务。我希望这是一个不区分大小写的匹配,因为路径变量的一部分将由用户输入。
我尝试过大量的映射、组合,但它总是失败,因为我的 set_fact 似乎总是将我的变量类型设置为字典以外的其他类型(列表、字符串等..)。
我只想进行简单的小写与小写比较,以找到与服务列表中可执行路径的匹配项。
任务:
- name: Getting services...
ansible.windows.win_service_info:
register: services
- name: Converting to lowercase...
set_fact:
lower_services: "{{ services | lower }}"
- name: Locating service by installation path...
set_fact:
target_service: "{{ lower_services |
selectattr('path', 'equalto', SchedulerPath | lower) |
first }}"
when: lower_services |
selectattr('path', 'equalto', SchedulerPath | lower) |
list | length > 0
问:“给定字典
d1
从列表中搜索项目test
不区分大小写。”
test: [key_A, kEY_b, key_x]
d1:
key_a: 1
KEY_B: 2
kEy_C: 3
A:更新小写键
d2: "{{ dict(d1.keys()|map('lower')|
zip(d1.values())) }}"
给予
d2:
key_a: 1
key_b: 2
key_c: 3
并将搜索到的项目也转换为小写。例如,
- debug:
var: d2[item|lower]
loop: "{{ test }}"
给予
ok: [test_01] => (item=key_A) =>
ansible_loop_var: item
d2[item|lower]: '1'
item: key_A
ok: [test_01] => (item=kEY_b) =>
ansible_loop_var: item
d2[item|lower]: '2'
item: kEY_b
ok: [test_01] => (item=key_x) =>
ansible_loop_var: item
d2[item|lower]: VARIABLE IS NOT DEFINED!
item: key_x
用于测试的完整剧本示例
- hosts: all
vars:
test: [key_A, kEY_b, key_x]
d1:
key_a: 1
KEY_B: 2
kEy_C: 3
d2: "{{ dict(d1.keys()|map('lower')|
zip(d1.values())) }}"
tasks:
- debug:
var: d2
- debug:
var: d2[item|lower]
loop: "{{ test }}"