Установите пакет rpm, используя Ansible

22

Как установить пакет .rpm на удаленной машине с помощью Ansible?

Очевидное решение - использовать commandмодуль, но это немного глупо. Также я хотел бы избежать установки репозитория yum только для одного пакета.

Есть ли более прагматичный подход к этой проблеме?

NefariousOctopus
источник
Вот для чего хорош ssh. Я знаю, что есть крутые утилиты для игры, но для реальных, нетривиальных задач это ssh.
Lorinczy Zsigmond

Ответы:

32

Ansible 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 параметру name.
Хенрик Пингель восстановит Монику
@technocrat, немного опоздал, но ответил
Flippym
4

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

- name: Remote RPM install with yum
  yum: name=http://example.com/some_package.rpm
Flippym
источник
из любопытства (кроме того, что это неправильный путь), почему это не работает? Оболочка для меня не удалась
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

игнорировать осторожность.

liuhao
источник
-1

Мне пришлось обязательно использовать команду rpm, потому что у меня нет yum (это ОС AIX).

Я решил идемпотентность с этим:

- 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
adrianlzt
источник
Эта задача выглядит идемпотентно только для Ansible. В действительности RPM будет перезагружаться и переустанавливаться каждый раз, когда вы его запускаете.
Майк