Ansible:更新select的软件包,如果没有安装则不安装

我有几十台CentOS 6和7的主机。我最近开始使用Ansible来帮助pipe理它们,但我仍然是一个新手。

像所有人一样,我定期需要在这些机器上更新软件包,特别是出于安全原因。 但是,我不想更新它们上的所有软件包,只是特定的软件包,这些软件包可能因机器而异,具体取决于其angular色。 我已经使用了Ansible的yum命令( state = latest )和一个特定的软件包列表来更新这些主机,但是直到今天我才注意到,在对主机运行时,如果没有安装其中一个列出的软件包在那台机器上它将被安装。

我需要的是一种向Ansible提供软件包列表的方法,然后对每个主机执行操作: – 如果软件包存在,则将其更新为最新版本; – 如果包装不存在,什么都不要做。

有没有一个可行的方法来做到这一点?

如果您只想用可用更新更新软件包的子集,则可能需要尝试@wurtel的尝试。 您将需要像这样注册已安装的软件包:

 - name: Get installed packages. command: rpm -qa --qf "%{NAME}\n" register: installed_packages 

然后,您可以定义一个集合理论filter,并更新允许更新packages_to_update的软件包列表中定义的所有packages_to_update

 - name: Update subset of packages. yum: name: "{{ item }}" state: latest with_items: - {{ installed_packages | intersect(packages_to_update) }} 

这对yum更新似乎有点复杂?

为什么不直接使用本地命令,直到Ansible开始允许这个选项?

这样一个简单的手册就可以做到。

 --- - hosts: dev-systems remote_user: admin become: yes tasks: - name: Update installed packages. command: /usr/bin/yum update -y {{item}} with_items: - package1 - package2 - package3 - package-etc 

我只是testing这个,并使用两个包。 一个需要更新,一个没有安装。 最终的结果是一个更新的软件包与其他正在安装。