Ansible yum Module: Manage Packages บน CentOS/RHEL

Ansible yum module ใช้จัดการ packages บนระบบ CentOS/RHEL/Fedora แทนการรัน yum หรือ dnf command โดยตรง มีโครงสร้างคล้ายกับ apt module แต่ปรับให้เหมาะกับ RPM-based distributions และ yum repositories

บทความนี้อธิบายการใช้ yum module ตั้งแต่ติดตั้ง/ลบ package, อัพเดทระบบ, จัดการ yum repository, ไปจนถึงการใช้ dnf module สำหรับ RHEL 8/9 และ Fedora ที่เปลี่ยนมาใช้ dnf

ติดตั้งและลบ Package พื้นฐาน

การใช้ yum module มีโครงสร้างเหมือนกับ apt ใช้ name และ state เป็น parameters หลัก

---
- name: Manage packages with yum
  hosts: redhat_servers
  become: true
  tasks:
    - name: Install httpd
      yum:
        name: httpd
        state: present

    - name: Install specific version
      yum:
        name: httpd-2.4.37-47.module_el8.6.0
        state: present

    - name: Remove package
      yum:
        name: postfix
        state: absent

    - name: Install latest version
      yum:
        name: nginx
        state: latest    # ติดตั้งหรืออัพเดทเป็น version ล่าสุด

ติดตั้งหลาย Package พร้อมกัน

เช่นเดียวกับ apt สามารถส่ง list ของ packages ใน name parameter ได้ yum รัน transaction เดียวสำหรับทุก packages

---
- name: Install LAMP stack
  hosts: webservers
  become: true
  tasks:
    - name: Install web server packages
      yum:
        name:
          - httpd
          - php
          - php-mysqlnd
          - php-fpm
          - mariadb-server
        state: present

    - name: Install development tools
      yum:
        name:
          - gcc
          - make
          - git
          - curl
          - wget
          - vim
        state: present

    - name: Remove unwanted packages
      yum:
        name:
          - sendmail
          - telnet
        state: absent

อัพเดท Packages

state: latest อัพเดท package เดียว ส่วนการอัพเดทระบบทั้งหมดใช้ name: '*' เพื่อ upgrade ทุก packages

---
- name: Update system
  hosts: all
  become: true
  tasks:
    - name: Update all packages
      yum:
        name: '*'
        state: latest

    - name: Update security packages only
      yum:
        name: '*'
        state: latest
        security: yes    # เฉพาะ security updates

    - name: Update specific package
      yum:
        name: openssl
        state: latest

    - name: Update from a specific advisory
      yum:
        name: '*'
        state: latest
        bugfix: yes    # รวม bugfix updates

จัดการ YUM Repository

module yum_repository เพิ่มหรือลบ repository จาก /etc/yum.repos.d/ ใช้แทนการเขียน .repo file ด้วย template

---
- name: Add repositories
  hosts: all
  become: true
  tasks:
    - name: Add EPEL repository
      yum_repository:
        name: epel
        description: EPEL YUM repo
        baseurl: https://dl.fedoraproject.org/pub/epel/$releasever/$basearch/
        gpgcheck: yes
        gpgkey: https://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-$releasever
        enabled: yes

    - name: Add nginx official repository
      yum_repository:
        name: nginx-stable
        description: nginx stable repo
        baseurl: http://nginx.org/packages/centos/$releasever/$basearch/
        gpgcheck: yes
        gpgkey: https://nginx.org/keys/nginx_signing.key
        enabled: yes

    - name: Disable repository
      yum_repository:
        name: epel
        state: present
        enabled: no

ติดตั้ง RPM จาก URL หรือไฟล์

yum module รองรับการติดตั้ง RPM โดยตรงจาก URL หรือ local file ไม่ต้องเพิ่ม repository ก่อน เหมาะสำหรับ package ที่ไม่อยู่ใน repo

---
- name: Install packages from RPM
  hosts: all
  become: true
  tasks:
    - name: Install EPEL release from URL
      yum:
        name: https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
        state: present

    - name: Install local RPM file
      yum:
        name: /tmp/mypackage-1.0.rpm
        state: present

    - name: Install package group
      yum:
        name: "@Development Tools"
        state: present

dnf Module สำหรับ RHEL 8/9 และ Fedora

RHEL 8+ และ Fedora ใช้ dnf แทน yum Ansible มี dnf module ที่ใช้งานเหมือนกัน แต่รองรับ features ใหม่ของ dnf

---
- name: Use dnf module on RHEL 8+
  hosts: rhel8_servers
  become: true
  tasks:
    - name: Install packages with dnf
      dnf:
        name:
          - nginx
          - python3
          - python3-pip
        state: present

    - name: Update all packages
      dnf:
        name: '*'
        state: latest

    - name: Install module stream
      dnf:
        name: "@nginx:1.18/common"    # dnf module stream
        state: present

    - name: Enable dnf module
      dnf:
        name: "@python38"
        state: present

ตรวจสอบ OS แล้วเลือก Module อัตโนมัติ

ใน Playbook ที่ต้องรองรับทั้ง Debian และ RHEL ใช้ package module ที่เป็น generic package manager หรือใช้ when condition ตาม ansible_os_family

---
- name: Cross-platform package management
  hosts: all
  become: true
  tasks:
    # วิธีที่ 1: ใช้ package module (generic)
    - name: Install curl (any OS)
      package:
        name: curl
        state: present

    # วิธีที่ 2: แยก task ตาม OS family
    - name: Install nginx on Debian/Ubuntu
      apt:
        name: nginx
        state: present
        update_cache: yes
      when: ansible_os_family == "Debian"

    - name: Install nginx on RedHat/CentOS
      yum:
        name: nginx
        state: present
      when: ansible_os_family == "RedHat"

    # วิธีที่ 3: ใช้ include_tasks แยกไฟล์ตาม OS
    - name: Include OS-specific tasks
      include_tasks: "{{ ansible_os_family | lower }}_packages.yml"

Pattern: CentOS Server Provisioning

ตัวอย่าง Playbook สำหรับ provision CentOS/RHEL server รวม repository setup, package install, และ service configuration

---
- name: Provision CentOS Web Server
  hosts: centos_servers
  become: true
  vars:
    base_packages:
      - epel-release
      - vim
      - curl
      - wget
      - git
      - htop
    web_packages:
      - nginx
      - certbot
      - python3-certbot-nginx

  tasks:
    - name: Update all packages
      yum:
        name: '*'
        state: latest
        security: yes

    - name: Install base packages
      yum:
        name: "{{ base_packages }}"
        state: present

    - name: Install web packages
      yum:
        name: "{{ web_packages }}"
        state: present

    - name: Start and enable firewalld
      service:
        name: firewalld
        state: started
        enabled: yes

    - name: Allow HTTP and HTTPS
      firewalld:
        service: "{{ item }}"
        permanent: yes
        state: enabled
        immediate: yes
      loop:
        - http
        - https

    - name: Start nginx
      service:
        name: nginx
        state: started
        enabled: yes

สรุป

yum module เป็นเครื่องมือหลักสำหรับจัดการ packages บน RHEL/CentOS ใน Ansible โดยมีโครงสร้างคล้ายกับ apt แต่มี parameters เพิ่มเช่น security: yes และ bugfix: yes สำหรับ targeted updates

สำหรับ RHEL 8/9 และ Fedora ให้ใช้ dnf module แทน yum เพราะรองรับ module streams และ features ใหม่ของ dnf ถ้าต้องการ Playbook รองรับหลาย OS ใช้ package module (generic) หรือแยก task ด้วย ansible_os_family fact