我有几十台混合使用 CentOS 6 和 7 的主机。我最近开始使用 Ansible 来帮助管理它们,但我仍然是个新手。
和所有人一样,我定期需要更新这些机器上的软件包,尤其是出于安全原因。但是,我不想更新全部软件包,只是特定的软件包——根据机器的角色,这些软件包可能因机器而异。我使用了 Ansible 的好吃命令,使用状态=最新以及特定软件包的列表,以便在过去更新这些主机,但直到今天我才注意到,当针对主机运行该程序时,如果列出的软件包之一未安装在该机器上,则会安装该软件包。
我需要一种方法来向 Ansible 提供一个软件包列表,然后针对每个主机执行以下操作: - 如果软件包存在,则将其更新为最新版本; - 如果软件包不存在,则不执行任何操作。
有什么切实可行的方法可以做到这一点吗?
答案1
从 ansible 2.5 开始,update_only
yum 有一个选项(从 ansible 2.1 开始only_upgrade
,apt 有一个选项),只有系统上已安装最新版本时才会安装最新版本。因此,您可以添加该选项,而不必在另一个任务中收集软件包列表。
- name: Update subset of packages.
yum:
name: "{{ item }}"
state: latest
update_only: yes
with_items:
- package1
- package2
我自己在网上搜索,在找到官方文档之前就找到了这篇文章。所以我认为在这里添加它更糟糕。
答案2
如果您只想更新具有可用更新的软件包子集,您可能需要尝试@wurtel 的尝试。您需要像这样注册已安装的软件包:
- name: Get installed packages.
command: rpm -qa --qf "%{NAME}\n"
register: installed_packages
然后你可以定义一个集合理论过滤器并更新允许更新的包列表中定义的所有包packages_to_update
。
- name: Update subset of packages.
yum:
name: "{{ item }}"
state: latest
with_items:
- {{ installed_packages | intersect(packages_to_update) }}
答案3
对于 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
我刚刚测试了这一点,并使用了两个软件包。一个需要更新,另一个尚未安装。最终结果是更新了软件包,而另一个尚未安装。