RHCE Ansible Playbooks Documentation

1. Repository Configuration adhoc.yml
Configure repositories on all nodes with BaseOS and AppStream
---
- name: Configure repositories on all nodes
  hosts: all
  tasks:
    - name: Configure BaseOS repository
      ansible.builtin.yum_repository:
        name: baseos
        description: Baseos Description
        baseurl: http://content/rhel9.0/x86_64/dvd/BaseOS
        gpgcheck: yes
        gpgkey: http://content.example.com/rhel9.0/x86_64/dvd/RPM-GPG-KEY-redhat-release
        enabled: yes

    - name: Configure AppStream repository
      ansible.builtin.yum_repository:
        name: appstream
        description: App Description
        baseurl: http://content/rhel9.0/x86_64/dvd/AppStream
        gpgcheck: yes
        gpgkey: http://content.example.com/rhel9.0/x86_64/dvd/RPM-GPG-KEY-redhat-release
        enabled: yes
2. Collection Installation bash commands
Install ansible.posix and system roles collections
# Create collections directory
mkdir -p /home/student/ansible/collections

# Install ansible.posix collection
ansible-galaxy collection install -p /home/student/ansible/collections \
  http://content/Rhce/ansible-posix-1.4.0.tar.gz

# Install system roles collection
ansible-galaxy collection install -p /home/student/ansible/collections \
  http://content/Rhce/redhat-rhel_system_roles-1.0.0.tar.gz
3. Apache Role apache_role.yml
Create offline role named apache with httpd service and templated web page
  • Install httpd package and enable service
  • Host web page using template.j2
  • Template shows FQDN and IP address
  • Run role in dev group
# Directory structure
mkdir -p roles/apache/{tasks,templates}

# roles/apache/tasks/main.yml
---
- name: Install httpd package
  ansible.builtin.yum:
    name: httpd
    state: present

- name: Start and enable httpd service
  ansible.builtin.service:
    name: httpd
    state: started
    enabled: yes

- name: Deploy template
  ansible.builtin.template:
    src: template.j2
    dest: /var/www/html/index.html

# roles/apache/templates/template.j2
My host is {{ ansible_fqdn }} on {{ ansible_default_ipv4.address }}

# apache_role.yml
---
- name: Apply apache role to dev group
  hosts: dev
  roles:
    - apache
4. Package Installation packages.yml
Install packages in different groups with separate plays
---
- name: Install packages in dev and test groups
  hosts: dev,test
  tasks:
    - name: Install vsftpd and mariadb-server
      ansible.builtin.yum:
        name:
          - vsftpd
          - mariadb-server
        state: present

- name: Install RPM Development Tools in prod group
  hosts: prod
  tasks:
    - name: Install group package
      ansible.builtin.yum:
        name: "@RPM Development Tools"
        state: present

- name: Update all packages in dev group
  hosts: dev
  tasks:
    - name: Update all packages
      ansible.builtin.yum:
        name: '*'
        state: latest
5. Hardware Report hwreport.yml
Collect hardware information and save to /root/hwreport.txt
---
- name: Collect hardware report on all nodes
  hosts: all
  tasks:
    - name: Download hwreport.txt template
      ansible.builtin.get_url:
        url: http://content.example.com/Rhce/hwreport.txt
        dest: /tmp/hwreport_template.txt
        mode: '0644'

    - name: Generate hardware report
      ansible.builtin.template:
        src: /tmp/hwreport_template.txt
        dest: /root/hwreport.txt
      vars:
        HOSTNAME: "{{ ansible_fqdn | default('NONE') }}"
        MEMORY: "{{ ansible_memtotal_mb | default('NONE') }}MB"
        BIOS: "{{ ansible_bios_version | default('NONE') }}"
        CPU: "{{ ansible_processor_vcpus | default('NONE') }}"
        DISK_SIZE_VDA: "{{ (ansible_devices.vda.size if ansible_devices.vda is defined else 'NONE') }}"
        DISK_SIZE_VDB: "{{ (ansible_devices.vdb.size if ansible_devices.vdb is defined else 'NONE') }}"
6. Cron Job Setup crontab.yml
Create cronjob for devops user to run every 2 minutes
---
- name: Create cron job for devops user
  hosts: all
  tasks:
    - name: Add cron job for devops user
      ansible.builtin.cron:
        name: "EX294 logger job"
        user: devops
        minute: "*/2"
        job: 'logger "EX294 in progress"'
7. Logical Volume Management lvm.yml
Create logical volume with fallback size and filesystem
---
- name: Create logical volume
  hosts: all
  tasks:
    - name: Check if research VG exists
      ansible.builtin.command: vgdisplay research
      register: vg_check
      ignore_errors: yes
      changed_when: false

    - name: Debug message if VG not found
      ansible.builtin.debug:
        msg: "vg not found"
      when: vg_check.rc != 0

    - name: Attempt to create 1500M LV
      ansible.builtin.lvol:
        vg: research
        lv: data
        size: 1500m
        state: present
      register: lv_creation
      ignore_errors: yes
      when: vg_check.rc == 0

    - name: Debug message if insufficient space for 1500M
      ansible.builtin.debug:
        msg: "Insufficient size of vg"
      when: vg_check.rc == 0 and lv_creation is failed

    - name: Attempt to create 800M LV if 1500M failed
      ansible.builtin.lvol:
        vg: research
        lv: data
        size: 800m
        state: present
      when: vg_check.rc == 0 and lv_creation is failed

    - name: Create ext3 filesystem on data LV
      ansible.builtin.filesystem:
        fstype: ext3
        dev: /dev/research/data
      when: "'data' in ansible_lvm.lvs.research|default([])"