使用 dnf 与 CentOS¶
- 日期:
2017-07-28 00:00
- 标签:
centos, dnf, 软件包
CentOS 7 当前使用 yum 作为其默认软件包管理器。然而,Fedora 已经转向 dnf 几个版本,并且它提供了显著的性能优势。它可以更有效地管理元数据缓存、评估依赖关系以及处理最快的镜像检查。
dnf 和 yum 软件包管理器可以共存,而不会引起冲突。几个 Fedora 版本同时运行这两个管理器。dnf 包在 EPEL 仓库中可用(我们当前启用了这些仓库)。它还使用所有现有的 yum 仓库和 GPG 密钥。
问题描述¶
CentOS gate 作业非常慢,并且集成的 gate 经常在 tempest 运行中超时。每个角色中最耗时的任务涉及发行版软件包的安装,因为这些任务使用 state: latest 的 yum 任务。
当 Ansible 看到 state: latest 时,它会经历一个相当繁琐的过程
运行
check-update,它会检查整个系统是否有更新。如果返回了一些软件包(需要更新),Ansible 会搜索列表,查看来自
yum任务的任何软件包是否在该列表中。如果需要更新一些软件包,Ansible 会调用
yum来安装这些软件包。
即使对于一个软件包,这个过程也可能需要 5-8 秒。相比之下,dnf 完成任务需要 0.8-1.6 秒。这应该给我们一些余地,以便更快地完成 CI 作业,并将更多的 CentOS 作业从非投票转换为投票。
提议的变更¶
在 CentOS 系统上,我们应该安装 dnf 和 python-dnf(用于 Ansible 兼容性)。Ansible 会优先选择 dnf 而不是 yum,因此我们需要确保每个角色都支持 dnf 任务。由于这两个软件包管理器可以互换,可以通过将 *_install_dnf.yml 任务文件符号链接到 *_install_yum.yml,并在这些任务文件中使用 package 模块来完成。
备选方案¶
如果 dnf 未被优先选择,我们可以避免在 CentOS 安装中使用 state: latest。这将导致 CentOS 部署与 Ubuntu 和 OpenSUSE 部署不同,并且会使错误分类更加困难。
另一种选择是在提供 state: latest 时更新整个系统,但将所有软件包安装任务切换为使用 state: present。这将节省我们一些时间,因为 Ansible 将跳过 check-update 步骤,直接进入更新所有软件包。然而,这将是另一个与 Ubuntu/OpenSUSE 过程的偏差。
Playbook/Role 影响¶
每个具有一组 yum 任务的角色都需要转换为使用 package。需要一个符号链接,以便安装了 dnf 的 CentOS 系统将使用相同的任务。
升级影响¶
在升级过程中,dnf 将被安装在 CentOS 系统上。Ansible 将开始使用 dnf,但部署者可以继续使用 yum 进行他们自己的管理任务(如果他们更喜欢的话)。
安全影响¶
dnf 软件包管理器支持与 yum 相同的配置选项,用于检查软件包和仓库的 GPG 密钥。
性能影响¶
dnf 软件包管理器将在管理软件包时提供更好的性能,但系统的其余部分将保持相同的性能水平。
最终用户影响¶
最终用户不会注意到此更改或从中获得任何好处。
部署者影响¶
部署者可能会注意到,一些角色使用 dnf,而另一些角色使用 yum,直到所有补丁合并。这不会影响正在运行的系统,但可能会使一些 playbook 比其他 playbook 运行得更快。
部署者将继续以他们今天所做的方式进行部署。
开发人员影响¶
开发人员必须意识到 CentOS 系统上存在 dnf,并且 Ansible 会优先选择它而不是 yum。任何新的角色/playbook 或对现有角色的更新都需要包含对 dnf 的支持,通过 dnf 模块或 package 模块(后者已经选择 dnf 而不是 yum)。
依赖项¶
此规范不依赖于任何其他规范或蓝图。
实现¶
负责人¶
- 主要负责人
Major Hayden (IRC: mhayden, Launchpad: rackerhacker)
工作项¶
首先将
dnf补丁添加到基本角色(openstack_hosts, lxc_hosts 等)继续向上移动依赖角色,直到所有角色都包含
dnf兼容的任务确保集成的仓库和 openstack-ansible-tasks 使用
dnf
测试¶
OpenStack CI 作业中完成的现有测试足以完成这项工作。如果 dnf 未正确或有效地安装软件包,我们将在测试 playbook 中看到这一点。
文档影响¶
这项工作需要一些发布说明,以通知开发人员和部署者 dnf 的更改。但是,由于 dnf 支持与 yum 相同的配置和参数,因此不需要详细的文档。
参考资料¶
openstack-ansible-openstack_hosts 的测试补丁:https://review.openstack.org/488268
Vultr 关于 CentOS 7 上 dnf 的文档:https://www.vultr.com/docs/use-dnf-to-manage-software-packages-on-centos-7