Why Use Ansible?
Understand what Ansible is and what makes it one of the most popular configuration management tools.
We'll cover the following
Overview
Ansible gives us flexibility where managing the configuration of our network’s nodes is concerned. We can understand this better with a simple scenario.
Let’s say we have been tasked to install a particular version of a
Why Ansible?
Here’s a list of reasons why Ansible is popular as a configuration management tool:
- The software is completely free.
- The learning curve is not steep, meaning that it’s easy to learn in a short time.
- Ansible uses idempotency, and it’s efficient where making changes to the configuration is concerned.
- We can use Ansible for various purposes, including orchestration, configuration management, application deployment, and more.
- With the collaborative power that version control offers, Ansible playbooks can be stored safely in repositories and help to determine the state of configuration of our infrastructure.
Architecture
The illustration given below shows the significant components of Ansible, which include:
- Playbooks
- Inventory
- Modules
- Plugins
In the following code, we’ll do a deep dive into the major components that make up Ansible’s automation engine.
Playbooks
A playbook is a collection of tasks to run against a managed node, with syntax as follows:
---hosts: <hosts_to_target>vars:<variable_name>: <value>tasks:...
Note that we have the hosts
keyword, which takes the value of the hosts we want to target. We similarly have the vars
keyword, which allows us to specify the required variables, and the tasks definition.
After we prepare a playbook, we can use ansible-lint <name_of_playbook>
to verify if our syntax is correct. We have an example playbook below to install httpd
on a group of hosts called webservers
. The playbook has only a single task, Install apache
, which uses the apt
module to install the latest httpd
package.
---- hosts: webserversconnection: localtasks:- name: Install apacheapt:name:- httpdstate: latestupdate_cache: true
Let’s verify the syntax of the install_apache.yml
file using the following command:
ansible-lint install_apache.yml
Playground
Running the ansible-lint
command will generate the necessary recommendation for the playbook we’re checking.
As we can see, the install_apache.yml
playbook has the following issues:
-
It contains some unnecessary whitespaces.
-
We try to install the latest version of Apache instead of a specific version like 2.2.
Inventory
An inventory is simply the list of hosts contained in our infrastructure setup. Let’s say we have ten servers grouped into five web servers and five load balancers. Then, we can have a grouping similar to the one below:
[webservers]<node_1_IP_address><node_2_IP_address><node_3_IP_address><node_4_IP_address><node_5_IP_address>[loadbalancers]<node_6_IP_address><node_7_IP_address><node_8_IP_address><node_9_IP_address><node_10_IP_address>
The default inventory for Ansible is contained in the /etc/ansible/hosts
path.
Plugins
We can use plugins to make the functionality of Ansible more robust. Here are some examples:
- Callback plugin: This allows Ansible to react to events and print output on the screen.
- Cliconf plugin: This helps secure connection between the Ansible controller node and the managed hosts.
- Action plugin: This acts as a layer between the different modules and the Ansible core execution engine.
- Become plugin: This is used to ensure that Ansible can perform privilege escalations as required. For example, these plugins allow Ansible to switch to a power user while running tasks against target machines.
- Cache plugin: This is used to ensure that facts/information about the target hosts is cached.
The three major plugins are the connection, action, and callback plugins because they’re used for executing the tasks defined in playbooks.
Modules
A module is essentially a type of plugin that makes up a playbook. Commands are executed on managed nodes using modules. There’s an exclusive list of modules, but some examples are listed below:
- Package management module: This is used to perform the function of local package managers like
apt
andrpm
on target hosts. - The
file
module: This is used to create, delete, and manipulate files. - The
template
module: This is similar to thecopy
module and is used to template files from the controller to the managed nodes. - The
archive
module: This is used for file compression and creating files with extensions of.tar
,.gzip
,.bz2
,.zip
, and so on. - The
command
/shell
modules: These are used to run shell scripts or commands on target nodes.