Ansibleを使用してrpmパッケージをインストールする


22

Ansibleを使用してリモートマシンに.rpmパッケージをインストールするにはどうすればよいですか?

明らかな解決策はcommandモジュールを使用することですが、それは少しばかげています。また、1つのパッケージだけにyumリポジトリを設定することは避けたいと思います。

この問題に対するより実用的なアプローチはありますか?


それがsshの利点です。クールなユーティリティがありますが、実際の重要なタスクはsshです。
ロリンツィージジモンド

回答:


32

Ansible yumモジュールはすでにこの問題の解決策を提供しています。サーバー上のローカルrpmファイルへのパスをnameパラメーターに渡すことができます。

Ansible yumのモジュールのドキュメント

URLまたはローカルパスをrpmファイルに渡すこともできます。複数のパッケージを操作するには、パッケージのコンマ区切りリストまたは(2.0以降)パッケージのリストを使用できます。

これを行う適切な手順は次のようになります。

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

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

すみません、見落としていました。ご協力ありがとうございました!:)
NefariousOctopus

最初にファイルをコピーすることなくこれを達成する方法はありますか?
テクノクラート

1
http経由でパッケージを利用可能にした場合、nameパラメータにURLを渡すことができます。
ヘンリックピンゲル復活モニカ

@technocrat、少し遅れたが答えた
-Flippym

4

実際には、yumモジュールは特定のURLから直接RPMをインストールできます。

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

好奇心から(間違った方法以外)、なぜこれが機能しないのですか?私のシェルでは失敗しました:yum install redhat.com/repo/my.rpm
eramm

おそらくプロトコルが欠けているからだと
思い

2

ソースマシンから複数のRPMをインストールする方法は次のとおりです。

- 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

同じ問題に陥り、@ Jim Hunzikerの投稿が正しい方向に私を押し込んだので、特定のrpmバージョンをインストールするためのソリューションを共有し、必要な場合にのみrpmをアップロードします。

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

これを試して:

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

警告を無視します。


-1

yum(AIX OS)がないため、rpmコマンドを強制的に使用する必要がありました。

私はこれでべき等性を解決しました:

- 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

このタスクは、Ansibleに対してべき等であるように見えます。実際には、RPMは実行するたびに再ダウンロードおよび再インストールされます。
マイク
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.