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.