Ansible yum模块以安装软件包列表并删除任何其他软件包

时间:2020-10-16 15:41:50

标签: ansible yum

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

目的是使用Ansible使所有这些计算机共享相同的已安装软件包列表,
AND 并删除列表中可能尚未安装的所有软件包。

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

2 个答案:

答案 0 :(得分:2)

以@gary lopez答案为基础,以提高安全性和性能。

首先,您需要获取要在最终计算机上安装的所有软件包的实际列表,包括系统随附的默认软件包。我认为该列表将位于var yum_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

答案 1 :(得分:1)

在第一个任务中,您需要使用state: present。你可以试试这个

vars:
  - yum_rpm:
    - tcpdump
    - tmux
    - psacct

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

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

  - name: "Remove any other unexpected package already installed"
    yum:
      name: "{{ item.name }}"
      state: absent
    with_items: "{{ __yum_packages.results }}"

但是我建议您验证要卸载的软件包,因为您可以卸载操作系统所需的一些软件包。