运行 Ansible playbook 列出多个服务器的 Windows 更新会输出多个报告

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

我有一个剧本列出了多个主机所需的所有 Windows 更新,然后使用 jinja 模板将结果输出到 html 文件。该剧本运行正常,但是,为每个主机创建了多个 html 文件。 html 文件名使用当前日期和时间来使其唯一。

例如,我的目标是 10 个主机,这会创建 10 个 html 文件,每个文件包含所有 10 个主机的 Windows 更新列表。

下面的剧本是角色的一部分:

---
- name: Search for Windows Updates
  ansible.windows.win_updates:
    category_names: '*'
    server_selection: "windows_update"
    state: searched
  register: check_win_updates_patchresult

- name: Create HTML report
  ansible.windows.win_template:
    src: report.j2
    dest: \\server\\reports\Windows_Patch_Report.html

如果您对此有任何指导,我将不胜感激。谢谢你。

我需要的是针对多个主机运行剧本并仅创建一份报告。到目前为止我还没有找到任何解决方案。

ansible
1个回答
0
投票

下面的剧本是角色的一部分:

剧本不能是角色的一部分,它以另一种方式工作——剧本可以导入/包含角色。您的示例是任务列表。

我需要的是针对多个主机运行剧本并只创建一个报告。

非常简单。

但是您没有指定您希望在哪里获得报告 - 实施将取决于它。这是关于模板以及在哪里运行它的问题。

例如,如果您想要一份包含所有主机数据的报告,您只需迭代主机列表,并在本地主机上通过

hostvars
引用注册变量(对主机进行后处理)来模板化报告
updates
为简单起见,省略了返回值):

<!-- report.html.j2 -->
<h1>Windows Updates</h1>

{% for server in group['windows'] %}
<h2>{{ server}}</h2>
<p>{{ hostvars[server].check_win_updates_patch_result.updates }}</p>
{% endfor %}

在这种情况下,应将创建报告的任务从您的角色中删除,或者将

localhost
委托给
run_once: true
(如果也是 Windows 计算机):

# roles/your_role_name/main.yaml
---
- name: Search for Windows Updates
  ansible.windows.win_updates:
    category_names: '*'
    server_selection: "windows_update"
    state: searched
  register: check_win_updates_patch_result

剧本看起来像这样:

# playbook.yaml
---
- name: Collect the data on Windows Updates
  hosts: windows
  roles:
    - your_role_name

- name: Generate the report
  hosts: localhost
  tasks:
    - name: Create HTML report
      ansible.windows.win_template:
        src: report.html.j2
        dest: \\server\\reports\Windows_Patch_Report.html

或者,如果您想在该机器上为每台机器提供一份报告,则模板会更简单,并且不应对剧本或角色进行任何更改:

<!-- report.html.j2 -->
<h1>Windows Updates</h1>
<h2>{{ inventory_hostname }}</h2>
<p>{{ check_win_updates_patch_result.updates }}</p>
© www.soinside.com 2019 - 2024. All rights reserved.