Назад | Перейти на главную страницу

Модуль 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 без использования shell что противоречит передовой практике с настройкой mgmt.

Мне придется удалить и переустановить пакет в два этапа?

РЕДАКТИРОВАТЬ:

Чтобы прояснить это, устанавливаемый .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

Причина, по которой это происходит, заключается в том, что поставщик апстрима не создал пакеты с разумной информацией о версии.

Это файлы RPM выпуска nodeource для NodeJS 8.x и 10.x соответственно, которые устанавливают соответствующий репозиторий yum.

Я загрузил каждого из них и просмотрел предоставленную ими информацию. Оба они имели одинаковое название, версию и выпуск:

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

Для rpm или yum нет способа отличить эти пакеты друг от друга. Их метаданные делают их похожими.

Сначала я бы пожаловался на это производителю, так что, надеюсь, они перепакуют эти файлы, чтобы придать им отличительные характеристики. Было бы логично использовать соответствующую версию NodeJS. А пока я думаю, что вы застряли в своем обходном пути. Модули упаковки Ansible не предусматривают «переустановку» пакета.

Это противоречит принципу работы Ansible. Ansible распознает, что нужный пакет уже установлен, поэтому пропускает его. Для модуля yum нет опции форсировки.

Лучше всего удалить пакет и переустановить. Это можно сделать в рамках одного сценария.

Есть ли конкретная причина, по которой вы пытаетесь это заставить?