First Steps with Ansible
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.
Installation
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
Initial Configuration
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:
[defaults]
hostfile=~/projects/home-cluster/ansible/hosts
Ensure that you can log into the managed hosts using your SSH key.
First Commands
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 sudo
:
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.:
ansible-playbook bootstrap-kubernetes.yaml
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.