Встановіть rpm-пакет за допомогою Ansible


22

Як встановити .rpm пакет на віддаленій машині за допомогою Ansible?

Очевидним рішенням є використання commandмодуля, але це трохи нерозумно. Також я хотів би уникати налаштування сховища Yum лише для одного пакету.

Чи є ще якийсь прагматичний підхід до цієї проблеми?


Ось для чого ssh добре. Я знаю, що є цікаві утиліти, з якими можна грати, але для актуальних, нетривіальних завдань це ssh.
Lorinczy Zsigmond

Відповіді:


32

Анзібль yumмодуль вже забезпечує вирішення цієї проблеми. Шлях до локального файлу rpm на сервері може бути переданий до nameпараметра.

З документації модуля Ansible yum :

Ви також можете передати URL або локальний шлях до файлу rpm. Для роботи з декількома пакетами це може приймати список пакунків, розділених комами, або (станом на 2.0) список пакетів.

Правильні кроки для цього були б приблизно такими:

- name: Copy rpm file to server
  copy:
     src: package.rpm
     dest: /tmp/package.rpm

- name: Install package.
  yum:
     name: /tmp/package.rpm
     state: present

Вибачте, я не помітив цього. Дякую за твою допомогу! :)
NefariousOctopus

Будь-який спосіб досягти цього, не спочатку копіюючи файл?
технократ

1
Якщо ви зробите пакет доступним через http, ви можете передати URL-адресу параметру імені.
Генрік Пінгель Відновити Моніку

@technocrat, трохи пізно, але відповів
Flippym

4

Насправді yumмодуль може встановити RPM безпосередньо з заданої URL-адреси:

- name: Remote RPM install with yum
  yum: name=http://example.com/some_package.rpm

з цікавості (крім того, це неправильний шлях), чому це не працює? Мене не вистачало
eramm

Я б сказав, що це, мабуть, тому, що в ньому відсутній протокол
Flippym

2

Ось що я роблю для встановлення декількох RPM з вихідної машини:

- name: mkdir /tmp/RPMS
  file: path=/tmp/RPMS state=directory

- name: copy RPMs to /tmp/RPMS
  copy:
    src: "{{ item }}"
    dest: /tmp/RPMS
  with_fileglob:
    - "../files/*.rpm"
  register: rpms_copied

- name: local RPMs not found
  fail:
    msg: "RPMs not found in ../files/"
  when: rpms_copied.results|length == 0 and rpms_copied.skipped and rpms_copied.skipped_reason.find('No items') != -1

- set_fact:
    rpm_list: "{{ rpms_copied.results | map(attribute='dest') | list}}"

- name: install RPMs
  yum:
    name: "{{rpm_list}}"

1

Оскільки я потрапив у пастку над тією самою проблемою, і пост @Jim Hunziker підштовхнув мене до правильного напрямку, я люблю поділитися своїм рішенням щодо встановлення конкретної версії rpm та завантажувати rpm лише у разі необхідності.

---
- hosts: testhosts
  tasks:
          - name: check if package installed
            command: rpm -q --qf "%{VERSION}\n" package
            args:
                    warn: false
            register: package_installed
            failed_when: false
            changed_when: package_installed.rc != 0
          - name: check package version
            shell: "[[ `rpm -q --qf \"%{VERSION}\n\" package` == '{{ package_version }}' ]]"
            args:
                    warn: false
            register: package_installed_version
            failed_when: false
            changed_when: package_installed_version.rc != 0
          - name: uninstall old package
            yum:
                    name: package
                    state: removed
            when: package_installed_version.rc != 0 and package_installed.rc == 0
          - name: copy package-rpm to /tmp
            copy:
                    src: package-{{ package_version }}-1.el7.x86_64.rpm
                    dest: /tmp/
            notify:
                    - remove package-rpm from /tmp
            when: package_installed_version.rc != 0
          - name: install package
            yum:
                    name: /tmp/package-{{ package_version }}-1.el7.x86_64.rpm
                    state: present
            when: package_installed_version.rc != 0
  handlers:
          - name: remove package-rpm from /tmp
            file:
                    name: /tmp/package-{{ package_version }}-1.el7.x86_64.rpm
                    state: absent

0

спробуйте це:

- name: Installed the rpm files
  shell: yum localinstall *.rpm -y
  args:
    chdir: /tmp/rpm_dir

ігноруйте попередження.


-1

Мені довелося використовувати обов'язкову команду rpm, оскільки у мене немає yum (це AIX OS).

Я вирішив наступну можливість:

- command: rpm -U "{{rpm}}"
  args:
    warn: false
  register: rpm_install
  failed_when: rpm_install.rc != 0 and "is already installed" not in rpm_install.stderr
  changed_when: rpm_install.rc == 0

Це завдання виглядає лише безсилим на Ansible. Насправді RPM буде перезавантажено та перевстановлено кожного разу, коли ви його запустите.
Майк
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.