我试图让 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 中执行此操作的最佳方法是什么,而不使用shell
which 违反配置管理的最佳实践。
我是否将被迫分两步卸载并重新安装软件包?
编辑:
为了明确这一点,正在安装的 .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
发生这种情况的原因是上游供应商没有使用健全的版本信息创建包。
这些分别是 NodeJS 8.x 和 10.x 的 nodesource-release RPM 文件,它们安装了相应的 yum 存储库。
我下载了他们每个人并查看了他们报告的信息。它们都具有相同的名称、版本和发行版:
rpm 或 yum 无法区分这些软件包。它们的元数据使它们看起来相同。
我首先会就此向供应商投诉,希望他们会重新打包这些文件以赋予它们一些显着特征。使用相应的 NodeJS 版本是合乎逻辑的。与此同时,我认为你坚持使用你的解决方法。Ansible 打包模块不提供“重新安装”包。
这与 Ansible 的工作方式背道而驰。Ansible 识别出所需的包已经安装,因此跳过它。yum 模块没有强制选项。
最好的办法是卸载软件包并重新安装。它可以在同一个剧本中完成。
你试图强迫它有什么特别的原因吗?