Ansible yum 模块相当于 rpm -i --force

Ansible yum 模块相当于 rpm -i --force

我正在尝试让 Ansible 强制安装一个 rpm 包来覆盖现有的包。

这有效:

- name: RPM force install nodesource and yum clean all
  shell: rpm -i --nosignature --force "https://rpm.nodesource.com/{{ nodejs_rhel_rpm_dir }}/el/{{ ansible_distribution_major_version }}/{{ ansible_architecture }}/nodesource-release-el{{ ansible_distribution_major_version }}-1.noarch.rpm" && yum clean all
  args:
    executable: /bin/bash
  tags:
    - nodejs

我宁愿这样做,而不使用shell模块:

- name: Install nodesource npm/node packages
  yum:
    name: "https://rpm.nodesource.com/{{ nodejs_rhel_rpm_dir }}/el/{{ ansible_distribution_major_version }}/{{ ansible_architecture }}/nodesource-release-el{{ ansible_distribution_major_version }}-1.noarch.rpm"
    state: latest
    update_cache: yes
  tags:
    - nodejs

但是,如果不直接使用 rpm,我似乎无法强制覆盖现有安装的版本。在 Ansible 中执行此操作的最佳方法是什么,而不使用 rpmshell则违反配置管理的最佳实践。

我是否要被迫分两步卸载并重新安装该软件包?

编辑:

为了清楚起见,正在安装的 .rpm 与当前安装的 .rpm 不同。

目前安装了一个:https://rpm.nodesource.com/pub_8.x/el/7/x86_64/nodesource-release-el7-1.noarch.rpm

新的是:https://rpm.nodesource.com/pub_10.x/el/7/x86_64/nodesource-release-el7-1.noarch.rpm

答案1

发生这种情况的原因是上游供应商没有创建具有合理版本信息的软件包。

这些分别是适用于 NodeJS 8.x 和 10.x 的 nodesource-release RPM 文件,用于安装相应的 yum 存储库。

我下载了每个版本并查看了报告的信息。它们的名称、版本和发布版本都相同:

Name        : nodesource-release
Version     : el7
Release     : 1
Architecture: noarch

rpm 或 yum 无法区分这些软件包。它们的元数据使它们看起来完全相同。

我首先会向供应商投诉此事,希望他们能重新打包这些文件,赋予它们一些独特的特性。使用相应的 NodeJS 版本是合乎逻辑的。与此同时,我认为你只能使用你的解决方法。Ansible 打包模块不提供“重新安装”包的功能。

答案2

这有点违背了 Ansible 的工作设计。Ansible 认为所需的软件包已经安装,因此会跳过它。yum 模块没有强制选项。

最好的办法是卸载软件包并重新安装。这可以在同一个剧本中完成。

你强行这么做有什么特别的原因吗?

相关内容