Ansible - 角色/任务未返回正确的值

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

我对 Ansible 还很陌生。我正在将剧本从直接使用模块的剧本转换为使用角色和任务的剧本。使用原始剧本,我可以从模块获取值,但无法将任务中使用的模块的返回值返回到剧本。

playbook 检查 Windows 目标节点的注册表。

这是我原来的剧本的片段:

---
- name: Reads Windows registry entries
  hosts: all
  gather_facts: yes
  tasks:
  - name: Obtain information about a registry key property 
    ansible.windows.win_reg_stat:
      path: HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion
      name: ProductName
    register: product_name
  - name: Summary info
    debug:
      msg:
        - "Windows version = {{product_name.value}}"

它给了我这样的返回值:

["Windows version = {'changed': False, 'type': 'REG_SZ', 'raw_value': 'Windows 10 Enterprise', 'value': 'Windows 10 Enterprise', 'exists': True, 'failed': False}"]

这很方便。我什至可以直接访问

value
成员(“Windows 10 Enterprise”),如上所示。

使用角色/任务的新剧本:

---
- name: Reads Windows registry entries
  hosts: all
  gather_facts: yes
  tasks:
    - name: Obtain information about a registry key property 
      ansible.builtin.include_role:
        name: read_registry
      vars:
        keys:
          - path: "HKLM:\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion"
            name: "ProductName"
    - name: Summary info
      debug:
        msg:
          - "Windows version = {{ result }}"

新的 read_registry/tasks/main.yml:

---
# tasks file for read_registry

- name: Inspect registry entries of Windows machine
  ansible.builtin.include_tasks: read_registry.yml
  loop: "{{ keys }}"
  loop_control:
    loop_var: keys
  register: result

实际任务文件:

---

  - name: Read Windows registry key
    ansible.windows.win_reg_stat:
      path: "{{ keys.path }}"
      name: "{{ keys.name }}"

剧本在

result
中获得了一个值,但它与我用原始剧本返回的值不同。它给我的是我调用模块所用的参数和一些其他信息,而不是注册表项的值:

["Windows version = {'results': [{'include': 'read_registry.yml', 'include_args': {}, 'keys': {'path': 'HKLM:\\\\SOFTWARE\\\\Microsoft\\\\Windows NT\\\\CurrentVersion', 'name': 'ProductName'}, 'ansible_loop_var': 'keys'}], 'skipped': False, 'msg': 'All items completed', 'changed': False}"]

虽然很高兴知道任务已完成,但这不是我需要的信息。

最终,新的剧本将有一个要检查的注册表项列表,例如:

keys:
  - path: "HKLM:\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion"
    name: "ProductName"
  - path: "SomeOtherLongKeyPath"
    name: "OtherKeyName"
  - path: "AnotherLongKeyPath"
    name: "NextName"

所以我想在最后报告所有的结果。我不确定如何用这种方法获得所有结果,但现在我什至没有得到一个正确的结果。

ansible
1个回答
0
投票

剧本在结果中返回了一个值,但它与我用原始剧本返回的值不同。

这是预料之中的。

在第一种情况下,您记录了特定

ansible.windows.win_reg_stat
任务执行的结果。在第二种情况下,您将记录
ansible.builtin.include_tasks
的结果,而从
ansible.windows.win_reg_stat
调用的
read_registry.yml
的结果不会记录在任何地方。

解决此问题的选项之一可能是定义一个列表并将

ansible.windows.win_reg_stat
调用的结果附加到其中。像这样的东西:

# read_registry.yml
---
- name: Read Windows registry key
  ansible.windows.win_reg_stat:
    path: "{{ keys.path }}"
    name: "{{ keys.name }}"
  register: key_result

- name: Add the result to the list
  set_fact:
    result: "{{ key_result + result | default([]) }}"

还可能有其他的,也许更优雅的解决方案,但我希望它能让您了解最初到底出了什么问题。

另外,我不建议将

loop_var
命名为与您正在迭代的实际变量相同的名称,以避免混淆(我实际上不确定它是否有效,但看起来确实如此)。

© www.soinside.com 2019 - 2024. All rights reserved.