我正在尝试让 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 模块没有强制选项。
最好的办法是卸载软件包并重新安装。这可以在同一个剧本中完成。
你强行这么做有什么特别的原因吗?