Instale el paquete rpm usando Ansible


22

¿Cómo instalo el paquete .rpm en una máquina remota usando Ansible?

La solución obvia es usar el commandmódulo, pero eso es un poco tonto. También me gustaría evitar configurar un repositorio de yum solo para un paquete.

¿Hay algún enfoque más pragmático para este problema?


Para eso es bueno ssh. Sé que hay buenas utilidades para jugar, pero para tareas reales y no triviales es ssh.
Lorinczy Zsigmond el

Respuestas:


32

Ansible yum módulo ya proporciona una solución para este problema. La ruta al archivo rpm local en el servidor se puede pasar al nameparámetro.

De la documentación del módulo Ansible yum :

También puede pasar una url o una ruta local a un archivo rpm. Para operar en varios paquetes, esto puede aceptar una lista de paquetes separados por comas o (a partir de 2.0) una lista de paquetes.

Los pasos adecuados para hacer esto serían algo como esto:

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

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

Lo siento, lo pasé por alto. ¡Gracias por tu ayuda! :)
NefariousOctopus

¿Alguna forma de lograr esto sin tener que copiar el archivo primero?
tecnócrata

1
Si hace que el paquete esté disponible a través de http, puede pasar la url al parámetro de nombre.
Henrik Pingel restablece a Mónica el

@technocrat, un poco tarde, pero respondió
Flippym

4

En realidad, el yummódulo puede instalar un RPM directamente desde una URL dada:

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

por curiosidad (aparte de que es el camino equivocado) ¿por qué esto no funciona? Me estaba fallando shell: yum install redhat.com/repo/my.rpm
eramm

Diría que probablemente sea porque le falta el protocolo
Flippym

2

Esto es lo que hago para instalar múltiples RPM desde la máquina fuente:

- 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

Debido a que atrapé el mismo problema, y ​​la publicación de @Jim Hunziker me empujó en la dirección correcta, me gusta compartir mi solución para instalar una versión específica de rpm y solo cargar las rpm si es necesario.

---
- 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

prueba esto:

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

ignorar la advertencia.


-1

Tuve que usar el comando rpm obligatorio porque no tengo yum (es un sistema operativo AIX).

He resuelto la idempotencia con esto:

- 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

Esta tarea solo parece idempotente para Ansible. En realidad, el RPM se volverá a descargar y reinstalar cada vez que lo ejecute.
Mike
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.