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

Ansible查询多服务器已安装RPM包并统一导出含主机名文件的方法

实现方案

方案1:完全匹配你期望的输出格式

直接修改原有剧本即可,通过逐行追加的方式把每个主机的主机名和对应RPM列表写入同一文件:

---
- hosts: all
  become: yes
  become_method: sudo
  tasks:
    - name: RPM packages query
      shell: rpm -qa --queryformat '%{NAME} %{VERSION}\n' 
      register: query 

    - name: 追加结果到统一文件
      local_action:
        module: lineinfile
        path: /home/user_name/all_rpm_result.txt
        line: |
          [**{{ ansible_hostname }}**
          ]

          {{ query.stdout_lines | to_nice_json }}

        create: yes
        state: present

注意:该方案输出的格式不是标准JSON,仅适合人工查看,无法直接用JSON解析工具处理。


方案2:更优的标准JSON输出方案(推荐)

推荐生成结构更规范的合法JSON文件,主机名作为键,对应RPM列表作为值,后续可直接用程序批量解析处理:

期望输出示例

{
  "host_name1": [
    "spice-glib 0.35",
    "keyutils-libs-devel 1.5.8",
    "mapserver 1.0",
    "perl-HTTP-Cookies 6.01",
    "open-vm-tools-desktop 11.0.5",
    "libreport-python 2.1.11"
  ],
  "host_name2": [
    "spice-glib 0.35",
    "keyutils-libs-devel 1.5.8",
    "mapserver 1.0",
    "perl-HTTP-Cookies 6.01"
  ]
}

对应剧本配置

---
- hosts: all
  become: yes
  become_method: sudo
  gather_facts: yes
  tasks:
    - name: 查询RPM包列表
      shell: rpm -qa --queryformat '%{NAME} %{VERSION}\n' 
      register: query 

    - name: 生成统一标准JSON文件
      local_action:
        module: copy
        content: |
          {% set result = {} %}
          {% for host in groups.all %}
          {%   do result.update({hostvars[host].ansible_hostname: hostvars[host].query.stdout_lines}) %}
          {% endfor %}
          {{ result | to_nice_json }}
        dest: /home/user_name/all_rpm_packages.json
      run_once: true

方案优势

  • 无并发写入冲突:通过run_once参数仅在控制端执行一次文件生成操作,不会因为多主机并行执行导致文件内容混乱
  • 兼容性强:标准JSON格式可直接被各类编程语言、JSON处理工具识别解析
  • 结构清晰:主机名与RPM列表直接关联,无需额外做匹配处理

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 11:45:08