Ansible is an open-source tool that allows you to automate server provisioning, manage configuration and deploy applications.
Where does a tool like Ansible fit in today’s immutable infrastructure world? While containers are better at enforcing immutability, if I’m starting from bare metal, I still need a tool to bootstrap and manage the compute and storage clusters that my containerised workloads will use. That’s where Ansible comes in.
First, let’s install Ansible on our control machine. In my case that’s my development laptop. On macOS we can use Homebrew:
brew install ansible
We also need to install Ansible on the nodes that we’ll be managing. It looks like this on Ubuntu:
sudo apt-get install software-properties-common sudo apt-add-repository -y ppa:ansible/ansible sudo apt-get update && sudo apt-get -y install ansible
Next we’ll need an inventory that lists the managed nodes. If you installed Ansible via homebrew, the default location is
~/homebrew/etc/ansible/hosts/hosts. Let’s go ahead and create our inventory:
[masters] master1 ansible_host=192.168.1.101 [minions] minion1 ansible_host=192.168.1.102 minion2 ansible_host=192.168.1.103 minion3 ansible_host=192.168.1.104 minion4 ansible_host=192.168.1.105
You can put the Ansible hostfile in a custom location. If you do that, you can tell Ansible about it in
~/.ansible.cfg. For example:
Ensure that you can log into the managed hosts using your SSH key.
Let’s take Ansible for a test drive. We can run a command from the control machine and target specific managed nodes:
ansible master1 -a date ansible minions -a date
Here’s an example of running a command against all the nodes, as root, via
ansible all -a "apt-get update" -bK
To run an Ansible module on a managed node:
ansible minion2 -m ping
Ansible modules are reusable scripts that can be used via the
ansible command and in Ansible Playbooks.
Next Steps - Playbooks
While using Ansible to run ad hoc commands against managed nodes is useful, its real power is unlocked via playbooks. Playbooks are Ansible’s configuration, deployment, and coordination language. They are written using YAML. Here’s an example from Ansible’s documentation website:
--- - hosts: webservers vars: http_port: 80 max_clients: 200 remote_user: root tasks: - name: ensure apache is at the latest version yum: name=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
As you can see, playbooks tend to be pretty self-documenting and more succint than ad hoc scripts.
To run a playbook, use the
ansible-playbook command e.g.:
I hope that this quick overview has given you an idea of what Ansible is, when you might want to use it, and how you would use it to manage remote hosts.