You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于Azure动态Inventory循环生成WaAgent配置状态报告?

解决Azure动态Inventory下Ansible生成CSV报告为空的问题

问题核心

本地单主机运行时,任务结果直接在当前上下文,模板能正常读取;切换到Azure动态Inventory的all_pls多主机组时,每个主机的任务结果仅存于各自的hostvars中,直接引用会因变量作用域问题导致模板循环无数据,最终生成空报告。

修正后的Playbook示例

---
- name: 收集Azure VM waagent配置并生成CSV报告
  hosts: all_pls
  gather_facts: false
  tasks:
    - name: 读取远程主机的/etc/waagent.conf
      ansible.builtin.slurp:
        src: /etc/waagent.conf
      register: conf

    - name: 提取AutoUpdate.Enabled状态
      ansible.builtin.set_fact:
        autoupdate_enabled: "{{ (conf.content | b64decode).split('\n') | select('search', '^AutoUpdate.Enabled') | first | regex_replace('^AutoUpdate.Enabled\\s*=\\s*(.*)$', '\\1') }}"

    - name: 汇总所有主机的状态到控制节点全局变量
      ansible.builtin.set_fact:
        vm_status_list: "{{ hostvars | dict2items | selectattr('key', 'in', groups['all_pls']) | map(attribute='value') | selectattr('autoupdate_enabled', 'defined') | list }}"
      delegate_to: localhost
      run_once: true

    - name: 生成CSV报告
      ansible.builtin.template:
        src: output.csv.j2
        dest: ./output.csv
      delegate_to: localhost
      run_once: true

对应的Jinja2模板(output.csv.j2)

主机名称,AutoUpdate.Enabled状态,任务是否变更
{% for vm in vm_status_list %}
{{ vm.inventory_hostname }},{{ vm.autoupdate_enabled }},{{ vm.conf.changed }}
{% endfor %}

关键调整说明

  1. 远程文件读取:用slurp模块读取远程主机的配置文件,替代本地lookup(后者仅在控制节点执行,无法获取远程文件)。
  2. 全局变量汇总:通过hostvars遍历all_pls组的所有主机,筛选出已提取状态的主机,生成统一列表并存储到控制节点的全局变量中,确保模板能访问到所有主机的数据。
  3. 单例执行控制:汇总和生成报告的任务添加run_once: true和delegate_to: localhost,避免多主机重复执行导致报告被覆盖,同时确保任务在控制节点执行。
  4. 处理conf.changed:模板中直接通过vm.conf.changed访问每个主机的任务变更状态,因为conf是每个主机的注册变量,已被包含在hostvars的主机数据中。

内容的提问来源于stack exchange,提问作者Amit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 04:45:44