首页 > 解决方案 > Ansible yum 模块用于安装软件包列表并删除任何其他软件包

问题描述

我必须处理以前由许多不同管理员手动管理的新机器(所有操作系统版本相同)。

目的是使用 Ansible 使所有这些机器共享相同的已安装包列表,
删除可能已安装的列表中未包含的任何包。

这对 Ansible 可行吗?

vars:
  - yum_rpm:
    - tcpdump
    - tmux
    - psacct

tasks:
  - name: "Install all package in our list"
    yum:
      name: "{{ yum_rpm }}"
      state: absent
      update_cache: no

  - name: "Remove any other unexpected package already installed"
    ## NO IDEA

标签: ansibleyum

解决方案


在 @gary lopez 答案的基础上增加安全性和性能。

首先,您需要获取您希望在最终机器上安装的所有软件包的实际列表,包括系统附带的默认软件包。我假设该列表将在 varyum_rpm

一旦你有了它,下一步就是获取机器上当前安装的包的列表。要创建一个实际的列表,我们可以重用:

  - name: Get installed packages
    yum:
      list: installed
    register: __yum_packages

  - name: Make installed packages a list of names
    set_fact:
      installed_packages: "{{ __yum_packages.results | map(attribute='name') | list }}"

从那里开始,添加和删除只是在列表上有所作为的问题。这里的目标是避免一个包一个包地循环 yum 模块包(因为它非常慢,并且在模块文档页面上被列为不好的做法),并一次完成安装和删除操作。

  - name: align packages on system to expected
    yum:
      name: "{{ item.packages }}"
      state: "{{ item.state }}"
    loop:
      - packages: "{{ yum_rpm | difference(installed_packages) }}"
        state: present
      - packages: "{{ installed_packages | difference(yum_rpm) }}"
        state: absent
    when: item.packages | length > 0


推荐阅读