Ansible yum 模块用于安装软件包列表并删除任何其他软件包
Ansible yum module to install a list of packages AND remove any other packages
我必须处理以前由许多不同的管理员手动管理的新机器(全部相同 OS 版本)。
目的是使用 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
在第一个任务中您需要使用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 }}"
但我建议您验证要卸载的包,因为您可以卸载 OS.
所需的一些包
在@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
我必须处理以前由许多不同的管理员手动管理的新机器(全部相同 OS 版本)。
目的是使用 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
在第一个任务中您需要使用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 }}"
但我建议您验证要卸载的包,因为您可以卸载 OS.
所需的一些包在@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