使用 ansible 删除与存储库关联的所有包

使用 ansible 删除与存储库关联的所有包

我使用 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 }}"

更多问答

更多文档

相关内容