Installieren Sie das RPM-Paket mit Ansible


22

Wie installiere ich das RPM-Paket mit Ansible auf einem Remotecomputer?

Die naheliegende Lösung ist die Verwendung eines commandModuls, aber das ist ein bisschen albern. Außerdem möchte ich vermeiden, ein Yum-Repository nur für ein Paket einzurichten.

Gibt es einen pragmatischeren Ansatz für dieses Problem?


Dafür ist ssh gut. Ich weiß, dass es coole Utensilien gibt, mit denen man spielen kann, aber für tatsächliche, nicht triviale Aufgaben ist es ssh.
Lorinczy Zsigmond

Antworten:


32

Ansible- yumModul bietet bereits eine Lösung für dieses Problem. Der Pfad zur lokalen rpm-Datei auf dem Server kann an den nameParameter übergeben werden.

Aus der Ansible yum-Moduldokumentation :

Sie können auch eine URL oder einen lokalen Pfad zu einer RPM-Datei übergeben. Um mit mehreren Paketen zu arbeiten, kann dies eine durch Kommas getrennte Liste von Paketen oder (ab 2.0) eine Liste von Paketen akzeptieren.

Die richtigen Schritte dazu wären etwa folgende:

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

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

Entschuldigung, ich habe es übersehen. Danke für deine Hilfe! :)
NefariousOctopus

Gibt es eine Möglichkeit, dies zu erreichen, ohne zuerst die Datei kopieren zu müssen?
Technokrat

1
Wenn Sie das Paket über http verfügbar machen, können Sie die URL an den Parameter name übergeben.
Henrik Pingel setzt Monica

@ Technocrat, ein wenig spät, aber beantwortet
Flippym

4

Tatsächlich kann das yumModul ein RPM direkt von einer bestimmten URL installieren:

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

aus Neugier (anders als falsch), warum funktioniert das nicht? Für mich hat es nicht geklappt
eramm

Ich würde sagen, es ist wahrscheinlich, weil es das Protokoll fehlt
Flippym

2

Folgendes mache ich, um mehrere RPMs vom Quellcomputer zu installieren:

- 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

Da ich über das gleiche Problem hinweggefangen habe und der Post von @Jim Hunziker mich in die richtige Richtung gelenkt hat, teile ich gerne meine Lösung für die Installation einer bestimmten RPM-Version und lade die RPM nur hoch, wenn dies erforderlich ist.

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

Versuche dies:

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

ignoriere das waring.


-1

Ich musste den Befehl rpm zwingend verwenden, da ich kein yum habe (es ist ein AIX-Betriebssystem).

Ich habe die Idempotenz damit gelöst:

- 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

Diese Aufgabe erscheint Ansible nur als idempotent. In Wirklichkeit wird das RPM bei jedem Start erneut heruntergeladen und neu installiert.
Mike
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.