Understanding Playbooks in Ansible

Introduction

Ansible is a powerful open-source automation tool used for configuration management, application deployment, and task automation. One of the core features that makes Ansible so effective is its Playbooks. Playbooks in Ansible are files that define a series of tasks to be executed on remote hosts. They are written in YAML (Yet Another Markup Language) and contain configurations and instructions that Ansible uses to automate processes across various machines.

In this article, we will provide a comprehensive guide on understanding Playbooks in Ansible, including their structure, how to write them, and practical examples to help you get started with automation.

What is a Playbook in Ansible?

A Playbook in Ansible is a file that contains a series of tasks and configurations that are executed on remote machines (also known as “hosts”). These tasks are performed sequentially, and each task typically performs a specific operation such as installing software, updating configurations, or deploying code.

Playbooks allow you to automate complex processes by defining tasks in a human-readable format. They are versatile, allowing you to perform multi-step processes on multiple machines at once.

Key Components of a Playbook

  1. Hosts: The list of target machines where the tasks will be executed.
  2. Tasks: A series of actions that Ansible will perform on the hosts.
  3. Modules: Reusable units of code that define the tasks (e.g., yum, service, copy).
  4. Variables: Dynamic elements that can be reused in the playbook, such as server names or paths.
  5. Handlers: Special tasks that are triggered when notified by other tasks, often used for service restarts or other reactive actions.

 

Structure of an Ansible Playbook

An Ansible Playbook is written in YAML format, which is easy to read and write. Below is a basic structure of a playbook:

---
- name: Playbook to manage a web server
  hosts: webservers
  become: yes  # Optional, use 'sudo' to run commands as superuser
  tasks:
    - name: Install Apache Web Server
      yum:
        name: httpd
        state: present

    - name: Start Apache Web Server
      service:
        name: httpd
        state: started

Breakdown of the Example:

—: Marks the beginning of a YAML document.
name: A description of the playbook or task.
hosts: Specifies the group of servers where the playbook should run.
become: Indicates whether to use sudo to escalate privileges for the tasks.
tasks: The list of tasks to be executed.

Each task typically consists of:

A name for identification.
A module (like yum, service, or copy).
Arguments that specify the module’s functionality (e.g., installing a package, starting a service).

 

Types of Playbooks in Ansible

1. Simple Playbook

A simple playbook contains a single set of tasks for a specific group of hosts.

Example of a Simple Playbook:

---
- name: Install and start Apache
  hosts: webservers
  tasks:
    - name: Install Apache
      yum:
        name: httpd
        state: present

    - name: Start Apache
      service:
        name: httpd
        state: started

This playbook installs and starts Apache on the webservers group.

2. Playbook with Multiple Plays

You can also write a playbook with multiple plays to manage different groups of hosts with different tasks.

Example of a Playbook with Multiple Plays:

---
- name: Configure web server
  hosts: webservers
  tasks:
    - name: Install Apache
      yum:
        name: httpd
        state: present
    - name: Start Apache
      service:
        name: httpd
        state: started

- name: Configure database server
  hosts: dbservers
  tasks:
    - name: Install MySQL
      yum:
        name: mysql-server
        state: present
    - name: Start MySQL
      service:
        name: mysqld
        state: started

In this example, one play configures web servers and another configures database servers. This is useful for deploying different configurations to different groups of hosts within the same playbook.

3. Playbook with Handlers

Handlers are special tasks that are triggered by other tasks in the playbook. For example, you may want to restart a service only if a configuration file was changed.

Example of a Playbook with Handlers:

---
- name: Configure and restart Apache if necessary
  hosts: webservers
  tasks:
    - name: Copy configuration file
      copy:
        src: /local/path/to/httpd.conf
        dest: /etc/httpd/conf/httpd.conf
      notify:
        - Restart Apache

  handlers:
    - name: Restart Apache
      service:
        name: httpd
        state: restarted

In this example:

  • The notify directive tells Ansible to trigger the Restart Apache handler if the copy task changes the configuration file.
  • The handler will restart the Apache service only when the configuration file is modified.

 

Running an Ansible Playbook

Once you have written your playbook, you can run it using the ansible-playbook command followed by the playbook file name.

Example Command:

ansible-playbook my_playbook.yml

This command will execute the playbook my_playbook.yml on the hosts defined in the playbook.

 

Best Practices for Writing Ansible Playbooks

  1. Use Descriptive Names: Always provide meaningful names for your tasks and plays to make the playbook easy to understand.
  2. Modularize Playbooks: Break complex playbooks into smaller, reusable roles or include separate files for easier management.
  3. Use Variables: Define variables for values that are likely to change, such as paths or server names. This makes playbooks more flexible and maintainable.
  4. Error Handling: Use the failed_when directive to handle errors gracefully and ensure that playbooks don’t exit unexpectedly.
  5. Version Control: Keep your playbooks in a version control system like Git for better tracking and collaboration.

Ashutosh Dixit

I am currently working as a Senior Technical Support Engineer with VMware Premier Services for Telco. Before this, I worked as a Technical Lead with Microsoft Enterprise Platform Support for Production and Premier Support. I am an expert in High-Availability, Deployments, and VMware Core technology along with Tanzu and Horizon.

Leave a Reply