Cài đặt gói vòng / phút bằng Ansible


22

Làm cách nào để cài đặt gói .rpm trên máy từ xa bằng Ansible?

Giải pháp rõ ràng là sử dụng commandmô-đun, nhưng đó là một chút ngớ ngẩn. Ngoài ra tôi muốn tránh thiết lập một kho lưu trữ yum chỉ cho một gói.

Có một số cách tiếp cận thực tế hơn cho vấn đề này?


Đó là những gì ssh là tốt cho. Tôi biết có những tiện ích tuyệt vời để chơi, nhưng đối với các nhiệm vụ thực tế, không tầm thường là nó ssh.
Lorinczy Zsigmond

Câu trả lời:


32

yumMô-đun Ansible đã cung cấp một giải pháp cho vấn đề này. Đường dẫn đến tệp vòng / phút cục bộ trên máy chủ có thể được truyền cho nametham số.

Từ tài liệu mô-đun Ansible yum :

Bạn cũng có thể truyền url hoặc đường dẫn cục bộ vào tệp vòng / phút. Để hoạt động trên một số gói, điều này có thể chấp nhận danh sách các gói được phân tách bằng dấu phẩy hoặc (kể từ 2.0) một danh sách các gói.

Các bước thích hợp để làm điều này sẽ là một cái gì đó như thế này:

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

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

Xin lỗi, tôi đã bỏ qua nó. Cảm ơn sự giúp đỡ của bạn! :)
NefariousOctopus

Bất kỳ cách nào để thực hiện điều này mà không phải sao chép tập tin trước?
kỹ thuật viên

1
Nếu bạn cung cấp gói có sẵn qua http, bạn có thể chuyển url đến tham số tên.
Henrik Pingel phục hồi lại

@technocrat, hơi muộn, nhưng đã trả lời
Flippym

4

Trên thực tế, yummô-đun có thể cài đặt RPM trực tiếp từ một URL nhất định:

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

vì tò mò (khác với cách làm sai) tại sao điều này không hiệu quả? Nó đã thất bại đối với tôi shell: yum install redhat.com/repo/my.rpm
eramm

Tôi có thể nói rằng có lẽ vì nó thiếu giao thức
Flippym

2

Đây là những gì tôi làm để cài đặt nhiều RPM từ máy nguồn:

- 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

Vì tôi bị mắc kẹt trong cùng một vấn đề và bài đăng của @Jim Hunziker đã đẩy tôi đi đúng hướng, tôi muốn chia sẻ giải pháp của mình để cài đặt một phiên bản vòng / phút cụ thể và chỉ tải lên vòng / phút nếu cần thiết.

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

thử đi:

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

bỏ qua chiến tranh.


-1

Tôi đã phải sử dụng lệnh bắt buộc bởi vì tôi không có yum (đó là hệ điều hành AIX).

Tôi đã giải quyết vấn đề bình thường với điều này:

- 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

Nhiệm vụ này chỉ có vẻ bình thường đối với Ansible. Trong thực tế, RPM sẽ được tải xuống và cài đặt lại mỗi khi bạn chạy nó.
Mike
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.