如何基于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 %}
关键调整说明
- 远程文件读取:用
slurp模块读取远程主机的配置文件,替代本地lookup(后者仅在控制节点执行,无法获取远程文件)。 - 全局变量汇总:通过
hostvars遍历all_pls组的所有主机,筛选出已提取状态的主机,生成统一列表并存储到控制节点的全局变量中,确保模板能访问到所有主机的数据。 - 单例执行控制:汇总和生成报告的任务添加
run_once: true和delegate_to: localhost,避免多主机重复执行导致报告被覆盖,同时确保任务在控制节点执行。 - 处理
conf.changed:模板中直接通过vm.conf.changed访问每个主机的任务变更状态,因为conf是每个主机的注册变量,已被包含在hostvars的主机数据中。
内容的提问来源于stack exchange,提问作者Amit
相关产品推荐
相关产品推荐

