Instal paket rpm menggunakan Ansible

22

Bagaimana cara menginstal paket .rpm pada mesin jarak jauh menggunakan Ansible?

Solusi yang jelas adalah dengan menggunakan commandmodul, tetapi itu agak konyol. Saya juga ingin menghindari pengaturan repositori yum hanya untuk satu paket.

Apakah ada pendekatan yang lebih pragmatis untuk masalah ini?

Okteopus jahat
sumber
Itulah gunanya ssh bagus. Saya tahu ada utils keren untuk bermain, tetapi untuk tugas-tugas yang sebenarnya, non-sepele itu ssh.
Lorinczy Zsigmond

Jawaban:

32

yumModul yang memungkinkan sudah memberikan solusi untuk masalah ini. Path ke file rpm lokal di server dapat diteruskan ke nameparameter.

Dari dokumentasi modul Anum yum :

Anda juga dapat meneruskan url atau jalur lokal ke file rpm. Untuk beroperasi pada beberapa paket, ini dapat menerima daftar paket yang dipisahkan koma atau (per 2.0) daftar paket.

Langkah yang tepat untuk melakukan ini adalah seperti ini:

- 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 Reinstate Monica
sumber
Maaf, saya mengabaikannya. Terima kasih untuk bantuannya! :)
NefariousOctopus
Adakah cara untuk melakukan ini tanpa harus menyalin file lebih dulu?
teknokrat
1
Jika Anda membuat paket tersedia melalui http Anda dapat meneruskan url ke parameter nama.
Henrik Pingel Reinstate Monica
@ technocrat, sedikit terlambat, tetapi menjawab
Flippym
4

Sebenarnya yummodul dapat menginstal RPM langsung dari URL yang diberikan:

- name: Remote RPM install with yum
  yum: name=http://example.com/some_package.rpm
Flippym
sumber
karena penasaran (selain itu cara yang salah) mengapa ini tidak berhasil? Gagal bagi saya shell: yum install redhat.com/repo/my.rpm
eramm
Saya akan mengatakan itu mungkin karena protokol tidak ada
Flippym
2

Inilah yang saya lakukan untuk menginstal beberapa RPM dari mesin sumber:

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

Karena saya terjebak pada masalah yang sama, dan posisi @Jim Hunziker mendorong saya ke arah yang benar, saya suka berbagi solusi untuk menginstal versi rpm tertentu dan hanya mengunggah rpm jika perlu.

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

coba ini:

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

abaikan perang itu.

liuhao
sumber
-1

Saya harus menggunakan perintah rpm karena saya tidak punya yum (ini adalah OS AIX).

Saya telah memecahkan idempotensi dengan ini:

- 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
sumber
Tugas ini hanya terlihat idempoten untuk Ansible. Pada kenyataannya, RPM akan diunduh ulang dan diinstal ulang setiap kali Anda menjalankannya.
Mike