ansible playbook if else if

3 min read 05-10-2024
ansible playbook if else if


Mastering Conditional Logic in Ansible Playbooks: If, Else If, and More

Ansible playbooks are powerful tools for automating infrastructure management. Often, you need to execute different tasks based on certain conditions. This is where conditional logic comes into play.

This article will guide you through the essential concepts of if, else if, and other conditional statements in Ansible playbooks. We'll break down how these statements work, provide practical examples, and help you confidently implement conditional logic in your automation workflows.

The Scenario: Configuring Network Interfaces

Imagine you need to configure a network interface on your server. The specific configuration depends on the operating system and network settings. Let's say we have a playbook that checks for the operating system and configures the interface accordingly:

---
- hosts: all
  become: true
  tasks:
    - name: Check operating system
      set_fact:
        os_type: "{{ ansible_distribution }}"

    - name: Configure network interface (CentOS)
      block:
        - name: Configure interface for CentOS
          # ... configuration tasks for CentOS
      when: os_type == "CentOS"

    - name: Configure network interface (Ubuntu)
      block:
        - name: Configure interface for Ubuntu
          # ... configuration tasks for Ubuntu
      when: os_type == "Ubuntu"

In this playbook, we first use the set_fact module to store the operating system type in a variable called os_type. Then, we use two separate blocks with when conditions to execute different tasks based on the os_type value.

Understanding if, elif, and else

The when condition in the above playbook allows us to execute blocks of code conditionally. However, for more complex scenarios, Ansible offers the if, elif, and else statements within a block statement. These statements enable you to write more sophisticated logic and handle multiple conditions within the same task.

Here's how the if, elif, and else statements work in Ansible:

  • if: Executes a block of code if the condition is true.
  • elif: Similar to if, but it's evaluated only if the preceding if or elif conditions were false.
  • else: Executes a block of code if all previous if and elif conditions were false.

Let's rewrite our network configuration example using if, elif, and else:

---
- hosts: all
  become: true
  tasks:
    - name: Check operating system
      set_fact:
        os_type: "{{ ansible_distribution }}"

    - name: Configure network interface
      block:
        - name: Configure interface for CentOS
          # ... configuration tasks for CentOS
        when: os_type == "CentOS"

        - name: Configure interface for Ubuntu
          # ... configuration tasks for Ubuntu
        when: os_type == "Ubuntu"

        - name: Default configuration
          # ... default configuration tasks
        when: os_type != "CentOS" and os_type != "Ubuntu"

In this example, we've combined the if and else logic into a single block statement. It's important to note that the else statement will only be executed if both previous when conditions are false.

Beyond Basic Conditions: Using Jinja2 Templating

Ansible's when statements can be combined with Jinja2 templating to create dynamic and powerful conditions. Jinja2 allows you to use variables, filter expressions, and control structures to evaluate complex conditions.

Here's an example of using Jinja2 templating with when:

---
- hosts: all
  become: true
  tasks:
    - name: Check disk space
      set_fact:
        disk_space: "{{ ansible_default_ipv4.address }} -f /var/log"
      register: disk_check

    - name: Clean log files
      block:
        - name: Remove old logs
          # ... commands to clean logs
        when: disk_check.disk_space.used_percent > 90

In this example, we check the disk space used by the /var/log directory using the disk_space variable. The when condition uses the disk_check.disk_space.used_percent variable to check if the disk space used is greater than 90%. If it is, then the block to clean logs is executed.

Conclusion

Ansible's if, elif, and else statements, combined with Jinja2 templating, empower you to build flexible and adaptable playbooks. By utilizing conditional logic, you can tailor your automation tasks to various environments and specific requirements, resulting in more efficient and robust infrastructure management.

Remember to carefully design your conditions, leverage variable values, and test your playbooks thoroughly to ensure they execute as intended. This will enable you to create robust and reliable automation solutions for your infrastructure.

Resources: