Playbooks in Ansible are what makes Ansible so handy. Playbooks allow for executing routine tasks with several modules. When should we use playbooks?
Let's take a look at a routine maintenance task: updating your servers. We would not have to use a playbook for this, given that it is just one command:
apt-get update. We could just use one single command to update software on all our servers. However, for deploying something like a web or database server, more work is needed: not just a single command. Playbooks are prefect for this case. They allow you to use multiple modules, which are commands that can be executed on a server. For example, there are modules for copying files, and performing shell commands over SSH.
So how do we use playbooks? Let's get started!
Ansible playbooks are written as
.yml files; Ansible cannot interpret other formats. An example Ansible playbook looks like this:
--- - hosts: webservers vars: http_port: 80 max_clients: 200 remote_user: root tasks: - name: ensure apache is at the latest version yum: pkg=httpd state=latest - name: write the apache config file template: src=/srv/httpd.j2 dest=/etc/httpd.conf notify: - restart apache - name: ensure apache is running (and enable it at boot) service: name=httpd state=started enabled=yes handlers: - name: restart apache service: name=httpd state=restarted
(Taken from Ansible's documentation)
As you can see, there are multiple sections in this playbook. First off, you will see the
hosts: line. This determines on which hosts the playbook should be executed. You can also see that we have defined a couple of variables that can be accessed and used throughout the playbook. You will then see a number of tasks. These tasks could be named something like "Install Apache", for example. The second task in the example writes to the Apache config. You will then see the following:
notify: - restart apache
This tells a task to execute a certain handler. In this case, it's referring to the handler
restart apache, which can be found at the bottom of the playbook:
handlers: - name: restart apache service: name=httpd state=restarted
Handlers are convenient because, taking the example, you might want to restart Apache multiple times. In this case, you do not have to repeat creating a task for every single time you need to restart Apache but instead, you can just refer to the same handler every time.
Say you want to deploy an Apache server. Well, as you can see, we have just created a playbook for that. Executing playbooks can be done by using the
ansible-playbook command. For example, if we were to execute this playbook on all servers in the
webservers category (you will need to have this category in your
/etc/ansible/hosts file), you'd run the following command given that the name of your playbook file is
ansible-playbook -i webservers apache.yml
Congratulations! You have now executed a playbook on all servers in your
webservers category. You'll now just have to wait for the deployment to finish, and you'll see that Apache has successfully been installed and configured on these servers.