我使用 ansibleapt_repository模块来添加和删除 Ubuntu 存储库。有时,我发现有必要从一个存储库切换到另一个存储库。我想在添加新存储库并安装包之前删除旧存储库中的所有包。目前,我明确使用 apt 模块来预先删除包。显然,如果两次应用相同的剧本,这会导致不必要/重复的工作。
我的问题是:
是否可以使用 ansible 从给定存储库中删除所有已安装的现有包(如果目标计算机上存在该存储库)?
(这是 Ubuntu 22.04 上的 ansible 2.10.8)。
我四处搜索,只发现这个(未实现)功能要求为了
模块的附加选项如带有选项的分布:
keep_all (default for backcompatibility) remove_other
或类似“present_and_remove_other_distribution”的附加状态。
这个附加选项应该使用 repo 字符串匹配所有现有的 repos,匹配除发行版之外所有具有完全相同 repo 名称的现有 repos
答案1
是否可以使用 ansible 从给定存储库中删除所有已安装的现有包(如果目标计算机上存在该存储库)?
是的,当然。由于请求的功能似乎在本机操作系统包管理器中尚未提供,因此您需要使用shell
包管理器的模块而不是 Ansible 模块。此外,还需要安装aptitude
。
- name: Make sure prerequisites are resolved
apt:
name: aptitude
state: present
- name: Gather list of packages from a specific repository
shell:
cmd: aptitude search '~O"{{ REPOSITORY }}" ~i'
changed_when: false
register: package_list
您需要查看结果集和数据结构以解决下一步(我还没有这样做,也没有测试过)。可能需要做一些数据处理。
- name: Make sure packages become removed
apt:
name: "{{ item }}" # or use "{{ package_list }}" directly without loop
state: absent
loop: "{{ package_list }}"
更多问答
更多文档