Zainstaluj pakiet RPM za pomocą Ansible

22

Jak zainstalować pakiet .rpm na zdalnym komputerze za pomocą Ansible?

Oczywistym rozwiązaniem jest użycie commandmodułu, ale to trochę głupie. Chciałbym również uniknąć konfigurowania repozytorium yum tylko dla jednego pakietu.

Czy istnieje bardziej pragmatyczne podejście do tego problemu?

NefariousOctopus
źródło
Do tego służy ssh. Wiem, że są fajne narzędzia do zabawy, ale w przypadku rzeczywistych, nietrywialnych zadań jest to ssh.
Lorinczy Zsigmond,

Odpowiedzi:

32

yumModuł Ansible już zapewnia rozwiązanie tego problemu. Ścieżkę do lokalnego pliku RPM na serwerze można przekazać do nameparametru.

Z dokumentacji modułu Ansible yum :

Możesz również przekazać adres URL lub ścieżkę lokalną do pliku RPM. Aby działać na kilku pakietach, można zaakceptować listę pakietów oddzieloną przecinkami lub (od 2.0) listę pakietów.

Właściwe kroki, aby to zrobić, byłyby mniej więcej takie:

- 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 Przywróć Monikę
źródło
Przepraszam, przeoczyłem to. Dziękuję za pomoc! :)
NefariousOctopus
Jakiś sposób, aby to zrobić bez uprzedniego skopiowania pliku?
technokrat
1
Jeśli udostępnisz pakiet za pośrednictwem http, możesz przekazać adres URL do parametru name.
Henrik Pingel Przywróć Monikę
@technocrat, trochę późno, ale odpowiedział
Flippym
4

W rzeczywistości yummoduł może zainstalować RPM bezpośrednio z danego adresu URL:

- name: Remote RPM install with yum
  yum: name=http://example.com/some_package.rpm
Flippym
źródło
z ciekawości (inaczej niż w niewłaściwy sposób) dlaczego to nie działa? Dla mnie nie powiodło się: mniam zainstalować redhat.com/repo/my.rpm
eramm
Powiedziałbym, że to prawdopodobnie dlatego, że brakuje protokołu
Flippym
2

Oto, co robię, aby zainstalować wiele RPM z komputera źródłowego:

- 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
źródło
1

Ponieważ wpadłem w pułapkę tego samego problemu, a post @ Jim Hunziker popchnął mnie we właściwym kierunku, lubię dzielić się moim rozwiązaniem dotyczącym instalacji konkretnej wersji rpm i przesyłać rpm tylko w razie potrzeby.

---
- 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
źródło
0

Spróbuj tego:

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

zignoruj ​​wojnę.

Liuhao
źródło
-1

Musiałem użyć obowiązkowej komendy rpm, ponieważ nie mam yum (jest to system operacyjny AIX).

Rozwiązałem idempotencja z tym:

- 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
źródło
To zadanie wygląda identycznie jak Ansible. W rzeczywistości RPM zostanie ponownie pobrane i ponownie zainstalowane przy każdym uruchomieniu.
Mike