Conditionals in Playbooks - CrewAI
Introduction
In this tutorial, we will explore the use of conditionals in playbooks. Conditionals are a powerful feature that allow you to execute tasks based on specific conditions. This can help you create more dynamic and flexible playbooks.
What are Conditionals?
Conditionals are statements that perform actions based on whether a condition is true or false. In the context of playbooks, they allow you to control the flow of tasks based on the values of variables, the results of previous tasks, or external inputs.
Basic Syntax
The basic syntax for conditionals in playbooks involves the when keyword. Here is a simple example:
- name: Install package only if not installed
apt:
name: httpd
state: present
when: ansible_os_family == "Debian"
In this example, the task to install the httpd package will only run if the ansible_os_family variable is equal to "Debian".
Using Facts in Conditionals
Facts are gathered by Ansible and can be used in conditionals to make decisions based on the system's state. Here is an example:
- name: Reboot the server if required
reboot:
msg: "Reboot initiated by playbook"
when: ansible_facts['os_family'] == "RedHat"
This task will only reboot the server if the operating system family is "RedHat".
Combining Multiple Conditions
You can combine multiple conditions using logical operators such as and and or. Here is an example:
- name: Install package if on Debian and version is 9 or 10
apt:
name: nginx
state: present
when: ansible_os_family == "Debian" and (ansible_distribution_version == "9" or ansible_distribution_version == "10")
This task will install the nginx package only if the system is running Debian and the version is either 9 or 10.
Tasks with Fallbacks
You can use conditionals to provide fallback tasks if a condition is not met. Here's an example:
- name: Check if the service is running
service_facts:
- name: Start the service if not running
service:
name: my_service
state: started
when: "'my_service' not in ansible_facts.services or ansible_facts.services['my_service'].state != 'running'"
In this example, the playbook will start my_service if it is not currently running.
Using Registered Variables
You can use variables registered in previous tasks as conditions for subsequent tasks. Here's an example:
- name: Check if file exists
stat:
path: /etc/myconfig.conf
register: myconfig
- name: Create the file if it does not exist
file:
path: /etc/myconfig.conf
state: touch
when: myconfig.stat.exists == False
This playbook will create the file /etc/myconfig.conf only if it does not already exist.
Conclusion
Conditionals in playbooks are a powerful way to control the flow of tasks based on dynamic conditions. By using facts, registered variables, and logical operators, you can create flexible and robust playbooks that adapt to different environments and scenarios. Experiment with these examples and incorporate conditionals into your own playbooks to improve their functionality.
