Tech Tutorial: Use Roles and Ansible Content Collections #
Introduction #
In the world of automated configuration and deployment, Ansible stands out for its simplicity and versatility. For Red Hat Certified Engineer (RHCE) candidates, understanding how to effectively utilize Ansible is crucial. This tutorial will delve into creating and working with roles and leveraging Ansible Content Collections, focusing specifically on Red Hat Enterprise Linux (RHEL).
Roles in Ansible are units of organization that allow for reusable content, making playbook development and maintenance easier. Ansible Content Collections, on the other hand, are a format for packaging and distributing Ansible content, including roles, plugins, and modules.
Step-by-Step Guide #
Setup Ansible on RHEL #
Before diving into roles and collections, ensure Ansible is installed on your RHEL system. You can install Ansible through the Red Hat Subscription Management (RHSM):
sudo subscription-manager repos --enable ansible-2-for-rhel-8-x86_64-rpms
sudo dnf install ansible
Creating a Role #
Roles organize tasks, handlers, files, templates, and variables into a structured directory. We will create a role to configure a web server.
Create Role Directory Structure
Use the
ansible-galaxycommand to initialize a new role:ansible-galaxy init web_serverThis command creates a directory structure under
web_server:web_server/ ├── defaults │ └── main.yml ├── files ├── handlers │ └── main.yml ├── meta │ └── main.yml ├── README.md ├── tasks │ └── main.yml ├── templates ├── tests │ ├── inventory │ └── test.yml └── vars └── main.ymlAdd Tasks
Edit
web_server/tasks/main.ymlto install and start Apache:--- - name: Install httpd yum: name: httpd state: present - name: Start httpd service systemd: name: httpd state: started enabled: yes
Using the Role in a Playbook #
Create a playbook deploy_web.yml that uses the web_server role:
---
- hosts: all
become: yes
roles:
- web_server
Ansible Content Collections #
Ansible Collections allow you to organize, share, and use roles across different projects.
Creating a Collection
Initialize a new collection using
ansible-galaxy:ansible-galaxy collection init my_namespace.my_collectionThis command generates a collection structure:
my_collection/ ├── docs/ ├── galaxy.yml ├── plugins/ │ └── modules/ ├── README.md ├── roles/ └── tests/Add Role to Collection
Move or link the
web_serverrole intomy_collection/roles/.Using Collection in a Playbook
Update
deploy_web.ymlto use the role from the collection:--- - hosts: all become: yes collections: - my_namespace.my_collection roles: - web_server
Detailed Code Examples #
Here’s a more complex task included in the web_server role to configure virtual hosts:
- name: Configure virtual hosts
template:
src: vhosts.j2
dest: /etc/httpd/conf.d/{{ item.vhost_name }}.conf
loop:
- { vhost_name: 'site1', server_admin: 'webmaster@site1.com', document_root: '/var/www/site1' }
- { vhost_name: 'site2', server_admin: 'webmaster@site2.com', document_root: '/var/www/site2' }
notify: restart httpd
This task uses the template module to create virtual host configurations from a Jinja2 template, iterating over a list of virtual hosts.
Conclusion #
Understanding and utilizing roles and collections in Ansible can significantly streamline the process of managing complex deployments across various environments. By encapsulating configuration logic into roles and organizing roles into collections, you can reuse code efficiently and maintain cleaner, more manageable playbooks. This tutorial has shown you how to establish these components in a RHEL environment, providing a strong foundation for further exploration and proficiency in Ansible automation.