Ansible:将 win_service_info 字典转换为小写

问题描述 投票:0回答:1

美好的一天,

我是 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
ansible ansible-2.x ansible-facts
1个回答
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 }}"
© www.soinside.com 2019 - 2024. All rights reserved.