yum包管理器模块
1. 概要
yum模块通过yum包管理器来管理包。- 使用yum软件包管理器安装,升级,降级,删除和列出软件包和组。
- 该模块仅适用于Python2。如果需要Python 3支持,请参见
dnf模块。 - 主机上面必须安装
yum包管理器。 - 源码:https://github.com/ansible/ansible/blob/devel/lib/ansible/modules/yum.py
- 官方文档:https://docs.ansible.com/ansible/latest/modules/yum_module.html
2. 参数
| 参数 | 可选值 | 默认值 | 说明 |
|---|---|---|---|
| allow_downgrade boolean | yes/no | no | 指定是否允许在已经安装有更高版本的情况下指定的软件包和版本降级处理。 请注意,设置allow_downgrade=True可使此模块以非幂等方式运行。 该任务最终可能会导致一组软件包与要安装的指定软件包的完整列表不匹配(因为降级的软件包与其他软件包之间的依赖关系可能导致对先前事务中的软件包进行更改)。 因此该操作很危险!!! |
| autoremove boolean | yes/no | no | 是否自动删除所有“叶”软件包,这些软件包最初是作为用户安装的软件包的依赖项安装的,但不再是任何此类软件包所必需的。注意,该参数应该单独使用,或者与state=absent一起作用。此功能要求yum>=3.4.3(RHEL/CentOS 7+) |
| bugfix - | yes/no | no | 如果本参数设置为yes,并且state=latest,那么仅安装标准为bugfix相关的更新 |
| conf_file - | 用于事务的远程yum配置文件。 | ||
| disable_excludes - | 禁用YUM配置文件中定义的排除项。 如果设置为all,则禁用所有排除。 如果设置为main,则禁用yum.conf中[main]中定义的排除项。 如果设置为 repoid,则禁用为给定的 repo ID定义的排除项。 | ||
| disable_gpg_check boolean | yes/no | no | 是否禁用正在安装的软件包签名的GPG检查。 仅当状态state为present或latest时才有效。 |
| disable_plugin - | 要为安装/更新操作禁用的插件名称。 禁用的插件在事务处理之后将不存在。 | ||
| disablerepo - | 禁用指定存储库,这些存储库的设置只对当前事务有影响,并不会像yum-config-manager一样禁用仓库。如果有多个存储库,使用英文逗号分隔,从Ansible 2.7开始,可以使用列表代替。 | ||
| download_dir string | 指定用于存储软件包的备用目录。仅当指定了download_only时才有效。 | ||
| download_only boolean | yes/no | no | 仅下载包,但不安装。 |
| enable_plugin - | 需要启用进行安装/更新操作的插件名称。 启用的插件在事务之后不存在。 | ||
| enablerepo - | 需要启用有存储库,这些存储库的设置只对当前事务有影响,并不会像yum-config-manager一样启用仓库。如果有多个存储库,使用英文逗号分隔,从Ansible 2.7开始,可以使用列表代替。 | ||
| exclude - | 需要排除的包名称,仅当状态state为present或latest时才有效。 | ||
| install_weak_deps boolean | yes/no | yes | 安装通过弱依赖关系链接的所有软件包。 注意:此功能需要yum >= 4(RHEL/CentOS 8+) |
| installroot - | Default: “/” | 指定一个备用installroot,相对于该根节点,将安装所有软件包。 | |
| list - | 要运行等效于yum list --show-duplicates <package>的软件包名称。 除了列出软件包外,还可以列出以下内容: installed已安装、updates更新、available可用、以及 repos存储库。 此参数与name互斥。 | ||
| lock_timeout integer | Default: 30 | 等待释放yum锁定文件的时间。 | |
| name list / elements=string | 带有版本的软件包名称或软件包说明符,例如name-1.0。 如果指定了以前的版本,则该任务还需要打开allow_downgrade。 有关降级软件包的注意事项,请参见allow_downgrade文档。 当使用state=latest时,它可以是*,这意味着运行yum -y update。 您还可以将url或本地路径传递给rpm文件(使用state=present)。要对多个软件包进行操作,可以接受英文逗号分隔的软件包字符串或软件包列表(从Ansible 2.0版开始)。 别名:pkg。 | ||
| releasever - | 指定安装所有软件包的替代版本。 | ||
| security boolean | yes/no | no | 如果设置为yes并且state=latest,则仅安装标记为安全相关的更新。 |
| skip_broken boolean | yes/no | no | 跳过依赖项已损坏的软件包,并抛出问题异常。 |
| state - | 可选值: absent installed latest present removed | 是否要安装(present or installed, latest)或移除(absent or removed)包装。 present和installed将仅确保已安装所需的软件包。 如果不是最新的可用版本,latest将更新指定的软件包。 absent和removed将删除指定的软件包。 默认值为None,但实际上默认动作为present,除非为此模块启用了autoremove自动删除选项,此时state=absent不存在。 | |
| update_cache boolean | yes/no | no | 强制yum检查缓存是否过期,并在需要时重新下载。仅当状态state为present或latest时才有效。别名expire-cache。 |
| update_only boolean | yes/no | no | 使用latest最新版本时,仅更新安装的软件包。 不要安装软件包。 仅在状态为state=latest最新时才有效。 |
| use_backend - | 可选值: auto ← yum yum4 dnf | auto自动 | 这个模块支持yum,上游yum开发人员将其称为yum3/YUM3/yum-preprecated。从Ansible2.7+开始,此模块还支持YUM4,这是新的yum,并且具有dnf后端。默认情况下,此模块将基于“ansible_pkg_mgr”事实选择后端。 |
| validate_certs boolean | yes/no | yes | 仅当使用https网址作为rpm的源时才适用。 例如用于本地安装。 如果设置为no,则不会验证SSL证书。 当使用自签名证书的个人站点时,可以设置为no,这样可以避免验证源站点。 在Ansible 2.1之前的版本中,代码就像设置为yes一样工作。 |
3. 注意事项
- 当与
loop循环一起使用时,每个包将被单独处理。将列表直接传递给name选项会更有效。 - 在1.9.2之前的版本中,此模块分别安装和卸载给yum模块的每个软件包。当必须一起安装或删除由文件名或URL指定的程序包时,这会引起问题。在1.9.2中,此问题已修复,因此可以在一个yum事务中安装软件包。但是,如果其中一个软件包添加了其他软件包所来自的新yum存储库(例如epel-release),则该软件包需要安装在单独的任务中。这模仿了yum的命令行行为。
- yum模块不支持以幂等的方式清除yum缓存,因此
yum模块不会自动清除yum缓存。唯一的方法是使用command命令模块直接调用yum命令,即yum clean all。 - 本模块中某些参数比较危险,不要随意测试!!!
- 本模块需要使用
root操作,因此需要使用become权限提升。
4. 返回值
| 键 | 何时返回 | 描述信息 |
|---|---|---|
| results list | 一直 | 相关包信息组成的列表,如"results": ["httpd-2.4.6-93.el7.centos.x86_64 providing httpd is already installed"] |
| changes dict | 有变更时 | 安装或卸载的包的信息,如"changes": {"removed": ["MariaDB-client", "MariaDB-server"]} |
5. 官方示例
| |
6. 基础知识
我们可以使用yum命令来搜索或安装、卸载包,下面列出一些相关的命令:
yum search <packagename>搜索某个包yum search <packagename> --showduplicates搜索某个包时显示多个版本yum info <packagename>查看某个包的介绍信息rpm -qa|grep <packagename>搜索是否安装了某个包yum install <packagename> -y安装某个包
我们来试一下这些命令:
| |
7. 使用临时命令
我们先来使用临时命令尝试运行一下yum模块的命令。
7.1 查看是否安装某软件
| |
7.2 查看多个软件包、软件包名大小写敏感
通过下面的示例可以看到软件包名大小写敏感,多个软件包之间使用英文逗号分隔开。
| |
8. 使用剧本
下面我们主要使用httpd、nginx、mysql包来进行相关的测试。
首先,我们使用剧本来卸载httpd、nginx、mysql包。
8.1 卸载包
| |
我们再查检查一下,这些包是否已经卸载了:
| |
可以看到,我们指定的包已经卸载了,Ansible并没有直接卸载相关的包。
8.2 安装包
::: tip 提示 脚本执行慢,半天没有响应,可能是软件包比较大,yum源比较慢,可以使用国内镜像源加速!!! :::
| |
将state: installed改成再试一下state: present。
| |
检查node1节点:
| |
后台运行的程序一直没有终止,我们按Ctrl+C强制终止Ansible运行。
手动执行安装操作看一下:
| |
可以看到,中间需要下载包,需要的时间比较长,00:19:22 ETA 提示还要19分钟,可能是因为这个原因导致我们认为Ansible卡住了。
我们重新运行剧本,但是把调试级别设置为-vv:
| |
运行的过程中,我们查看一下node1节点上面的缓存文件:
| |
可以看到,后台yum还在缓慢的下载文件!由于网速原因,下载比较慢。
经过漫长的等待,最终还是失败了!
| |
我们更新一下node1节点上面的MariaDB的源为清华源,参考 https://mirrors.tuna.tsinghua.edu.cn/help/mariadb/
修改后,MariaDB的源配置如下:
| |
再次执行剧本,成功执行:
| |
然后我们在node1节点上面检查一下:
| |
可以看到MariaDB-server和MariaDB-client安装成功了。
8.3 列出所有相关包
我们可以使用list参数来列出你想了解的某个包相关的可安裝的软件清单。
| |
可以看到列出了很多httpd相关的包了!
8.4 下载包但不进行安装
我们可以使用临时命令(如ansible node1 -b -m yum -a 'name=nginx download_only=yes download_dir=softs/nginx/')也可以使用剧本进行包的下载。
使用download_dir指定下载目录时,这个目录可以不用存在,Ansible会自动创建这个目录。
我们现在来使用剧本下载安装包。
| |
我们可以使用以下方法将403异常忽略掉。
| |
然后再进行检查:
| |
我们在node1节点上面检查一下,可以看到:
| |
当不指定下载目录时,yum会将依赖包下载到各自的仓库对应的缓存目录下,而指定目录时,会将所有的依赖包都下载到指定目录中。
8.5 安装指定版本软件
我计划升级一下httpd版本到比较新的2.4.41版本。
| |
现在我们尝试使用剧本来安装新版本。
| |
可以看到,因为软件包存在冲突,安装指定软件包失败!Ansible不会自动帮我们删除之前的旧版本的软件包。
因此我们先把旧版本的软件包删除,然后再安装。
| |
可以看到,旧的版本被卸载掉,新的版本安装成功,我们检查一下:
| |
可以看到,httpd已经成功升级了!
8.6 仓库的禁用
我们可以通过以下命令查看当前我们系统有哪些yum仓库:
| |
为了防止出现异常操作,我们先备份一下仓库的配置文件。
| |
我们可以直接使用yum-config-manager来管理仓库是否禁用。
| |
现在我们尝试使用disablerepo来禁用某个仓库。
| |
第一次运行,我们禁用了epel和ius仓库,此时,nginx包没有找到,因为nginx包是在epel仓库中。所以说明禁用生效了。
现在,假如我们不安装epel和ius仓库的软件,安装base仓库中的at包:
| |
可以看到at安装成功。此时我们查看一下epel和ius仓库状态:
| |
可以看到,并没有被禁用!
下面我尝试在剧本中安装一个在上一个任务中被禁用的仓库里面的包:
| |
此时,可以看到,虽然第一个任务禁用了ius仓库,但并不影响第二个任务,因此第二个任务中正常安装了ius仓库中的lua53u软件。
现在我们可以看出,我们使用disablerepo禁用仓库,只对某一具体的任务有效,相互之间并无关联。
8.7 仓库的启用
我们先卸载一下我们刚才安装的lua53u软件。
| |
我们可以通过sudo yum repo-pkgs ius list|more命令来查看ius仓库中有哪些包:
| |
我们可以知道tmux2在ius仓库中。
现在我们先使用yum-config-manager命令把ius仓库禁用掉。
| |
现在我们使用剧本来安装这两个软件。
| |
此时可以看到,任务install package with enable some repo因为使用了enablerepo: ius参数,启用了ius仓库,所有成功安装了lua53u,而任务install package without enable some repo因为没有启用ius仓库,所以此时找不到tmux2这个包,安装失败!
我们此时在node1节点上面检查一下:
| |
可以看到lua53u软件已经成功安装,tmux2仍然没有被安装,而ius仓库仍然是disabled禁用状态。说明enablerepo参数并不会更改远程主机yum的仓库禁用、启用设置,只是临时生效。与disablerepo类似,只在该参数相关的任务中才会生效!
8.8 通过远程仓库安装包
我们也可以直接指定远程仓库路径来安装包,但这个时候需要自己先找到包的地址:
| |
最后记得将原来禁用的仓库启用一下。
| |
说明ius仓库启用成功。
8.9 通过本地rpm文件安装软件
之前我们通过yum只下载不安装下载了nginx的安装包以及期依赖包。
| |
我们通过本地下载的安装包安装nginx:
| |
可以看到,所有的包都是从本地进行安装的,这个需要注意的是,安装过程中需要注意安装的顺序,先安装依赖包,依赖包安装完成后再安装nginx。
在node1节点上面检查,可以发现nginx包安装成功,并且可以查看到nginx的版本信息。
| |
yum模块其他的参数,官方也没有给出示例,用得也比较少,我们就不去理会。
你可以了解一下yum_repository模块 ( https://docs.ansible.com/ansible/latest/modules/yum_repository_module.html )来管理远程主机的yum仓库。
