DEV Community

Cover image for What I Learned This Week in Ansible (Week 3)
Ali Fareed
Ali Fareed

Posted on

What I Learned This Week in Ansible (Week 3)

What I Learned This Week in Ansible: Definitions and Examples

This week, I dove deep into Ansible, a powerful automation tool that’s become a cornerstone in configuration management. I focused on understanding its core concepts and practical applications. Here’s a rundown of what I learned, complete with definitions and examples to help clarify the concepts.

Playbooks

In Ansible, a playbook is a YAML file that contains a list of tasks to be executed on remote systems. It defines the desired state of the systems and describes the actions to achieve that state.

Example:
Here’s a simple playbook that installs and starts the Nginx web server on a target machine:

- name: Ensure Nginx is installed and running
  hosts: webservers
  become: yes

  tasks:
    - name: Install Nginx
      apt:
        name: nginx
        state: present

    - name: Start Nginx service
      service:
        name: nginx
        state: started
Enter fullscreen mode Exit fullscreen mode

hosts: webservers targets the machines listed under the webservers group in the inventory.
The apt module is used to install Nginx, and the service module ensures it is running.

Inventory

An inventory file lists the servers (hosts) that Ansible will manage. It can be a simple text file or a dynamic source like a cloud provider.

Example:
Here’s a basic inventory file (hosts.ini):

[webservers]
web1.example.com
web2.example.com

[dbservers]
db1.example.com
Enter fullscreen mode Exit fullscreen mode

This file defines two groups of servers: webservers and dbservers. The playbook will use these groups to determine where to execute tasks.

Roles

Roles are a way to organize playbooks into reusable components. Each role can contain tasks, handlers, variables, and other elements necessary for a specific function.

Example:
Here’s how to structure a role for installing and configuring Nginx:

roles/
  nginx/
    tasks/
      main.yml
    handlers/
      main.yml
    templates/
      nginx.conf.j2
    vars/
      main.yml
Enter fullscreen mode Exit fullscreen mode

tasks/main.yml: Contains tasks to install and configure Nginx.
handlers/main.yml: Defines handlers to restart Nginx if needed.
templates/nginx.conf.j2: A Jinja2 template for the Nginx configuration file.
vars/main.yml: Stores variables related to the Nginx role.

Variables

Variables in Ansible allow you to manage configuration values dynamically. They can be defined in playbooks, inventory files, or external sources.

Example:
Here’s how to use variables in a playbook:

- name: Configure Nginx with custom settings
  hosts: webservers
  become: yes
  vars:
    nginx_port: 8080

  tasks:
    - name: Configure Nginx port
      template:
        #src: nginx.conf.j2
        src: {{ nginx_port }}
        dest: /etc/nginx/nginx.conf
Enter fullscreen mode Exit fullscreen mode

In the nginx.conf.j2 template, you can use the variable nginx_port to set the port.

Handlers

Handlers are special tasks in Ansible that are triggered by other tasks. They are used to handle changes, such as restarting services when configuration files are updated.

Example:
Here’s a handler to restart Nginx if its configuration is changed:

- name: Restart Nginx
  service:
    name: nginx
    state: restarted

Enter fullscreen mode Exit fullscreen mode

You can notify this handler from a task using:

- name: Update Nginx configuration
  template:
    src: nginx.conf.j2
    dest: /etc/nginx/nginx.conf
  notify:
    - Restart Nginx
Enter fullscreen mode Exit fullscreen mode

Templates

Templates in Ansible are used to create configuration files dynamically. They leverage the Jinja2 templating engine to include variables and conditional logic.

Example:
Here’s a basic nginx.conf.j2 template:

server {
    listen {{ nginx_port }};
    server_name {{ server_name }};

    location / {
        proxy_pass http://localhost:8080;
    }
}

Enter fullscreen mode Exit fullscreen mode

In this template, nginx_port and server_name are variables that will be replaced with their actual values during playbook execution.

Conclusion

This week’s exploration of Ansible introduced me to its fundamental concepts, from writing playbooks and managing inventories to creating reusable roles and handling configurations with templates. Ansible’s modularity and clarity make it an invaluable tool for automating and orchestrating IT tasks. As I continue to deepen my understanding, I’m excited about the possibilities for streamlining workflows and improving efficiency in managing complex environments.

Feel free to reach out if you have any questions or need further clarification on any of these topics!

Top comments (0)