Instale o pacote rpm usando o Ansible

22

Como instalo o pacote .rpm na máquina remota usando o Ansible?

A solução óbvia é usar o commandmódulo, mas isso é um pouco bobo. Também gostaria de evitar a configuração de um repositório yum apenas para um pacote.

Existe alguma abordagem mais pragmática para esse problema?

NefariousOctopus
fonte
É para isso que serve o ssh. Eu sei que existem utilitários legais para brincar, mas para tarefas reais e não triviais é ssh.
Lorinczy Zsigmond

Respostas:

32

O yummódulo Ansible já fornece uma solução para esse problema. O caminho para o arquivo rpm local no servidor pode ser passado para o nameparâmetro

Na documentação do módulo Ansible yum :

Você também pode passar um URL ou um caminho local para um arquivo rpm. Para operar em vários pacotes, isso pode aceitar uma lista de pacotes separados por vírgula ou (a partir do 2.0) uma lista de pacotes.

As etapas apropriadas para fazer isso seriam algo como isto:

- 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 Restabelecer Monica
fonte
Desculpe, eu esqueci. Obrigado pela ajuda! :)
NefariousOctopus
Alguma maneira de fazer isso sem ter que copiar o arquivo primeiro?
technocrat
1
Se você disponibilizar o pacote via http, poderá passar o URL para o parâmetro name.
Henrik Pingel Restabelecer Monica
@technocrat, um pouco tarde, mas respondeu
Flippym
4

Na verdade, o yummódulo pode instalar um RPM diretamente de um determinado URL:

- name: Remote RPM install with yum
  yum: name=http://example.com/some_package.rpm
Flippym
fonte
por curiosidade (a não ser pelo caminho errado), por que isso não funciona? Estava falhando para mim shell: yum install redhat.com/repo/my.rpm
eramm 12/11
Eu diria que é provavelmente porque está faltando o protocolo
Flippym 13/11
2

Aqui está o que eu faço para instalar vários RPMs da máquina de origem:

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

Como prendi o mesmo problema e a postagem de @Jim Hunziker me levou à direção certa, gosto de compartilhar minha solução para instalar uma versão rpm específica e fazer upload apenas do rpm se necessário.

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

tente isto:

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

ignore o aviso.

liuhao
fonte
-1

Eu tive que usar o comando rpm obrigatório porque não tenho o yum (é um SO AIX).

Eu resolvi a idempotência com isso:

- 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
fonte
Esta tarefa parece apenas idempotente para Ansible. Na realidade, o RPM será baixado e reinstalado toda vez que você o executar.
Mike