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
相关产品推荐
相关产品推荐

