我对 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.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
命名为与您正在迭代的实际变量相同的名称,以避免混淆(我实际上不确定它是否有效,但看起来确实如此)。