Installer le package rpm à l'aide d'Ansible

22

Comment installer le package .rpm sur une machine distante à l'aide d'Ansible?

La solution évidente est d'utiliser le commandmodule, mais c'est un peu idiot. Je voudrais également éviter de configurer un référentiel yum pour un seul package.

Existe-t-il une approche plus pragmatique de ce problème?

NefariousOctopus
la source
C'est pour ça que ssh est bon. Je sais qu'il y a des utils sympas pour jouer avec, mais pour des tâches réelles et non triviales, c'est ssh.
Lorinczy Zsigmond

Réponses:

32

Un yummodule Ansible fournit déjà une solution à ce problème. Le chemin d'accès au fichier rpm local sur le serveur peut être transmis au nameparamètre.

Dans la documentation du module Ansible yum :

Vous pouvez également transmettre une URL ou un chemin d'accès local à un fichier rpm. Pour fonctionner sur plusieurs packages, cela peut accepter une liste de packages séparés par des virgules ou (à partir de 2.0) une liste de packages.

Les étapes appropriées pour ce faire seraient quelque chose comme ceci:

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

- name: Install package.
  yum:
     name: /tmp/package.rpm
     state: present
Henrik Pingel réintègre Monica
la source
Désolé, je l'ai oublié. Merci de votre aide! :)
NefariousOctopus
Est-il possible de le faire sans avoir à copier le fichier au préalable?
technocrate
1
Si vous rendez le package disponible via http, vous pouvez transmettre l'url au paramètre name.
Henrik Pingel réintègre Monica le
@technocrat, un peu en retard, mais a répondu
Flippym
4

En fait, le yummodule peut installer un RPM directement à partir d'une URL donnée:

- name: Remote RPM install with yum
  yum: name=http://example.com/some_package.rpm
Flippym
la source
par curiosité (autre que dans le mauvais sens) pourquoi cela ne fonctionne-t-il pas? Il échouait pour moi shell: yum install redhat.com/repo/my.rpm
eramm
Je dirais que c'est probablement parce qu'il manque le protocole
Flippym
2

Voici ce que je fais pour installer plusieurs RPM à partir de la machine source:

- 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}}"
Jim Hunziker
la source
1

Parce que j'ai piégé le même problème et que le message de @Jim Hunziker m'a poussé dans la bonne direction, j'aime partager ma solution pour installer une version spécifique de rpm et ne télécharger le rpm que si nécessaire.

---
- 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
NiJO
la source
0

essaye ça:

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

ignorer la mise en garde.

liuhao
la source
-1

J'ai dû utiliser obligatoirement la commande rpm car je n'ai pas miam (c'est un OS AIX).

J'ai résolu l'idempotence avec ceci:

- 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
la source
Cette tâche ne semble idempotente qu'à Ansible. En réalité, le RPM sera re-téléchargé et réinstallé chaque fois que vous l'exécuterez.
Mike