Ansible is a new configuration/orchestration management framework and is just awesome!
Why is that ?
- very short learning curve
- no need for a specific data service language
- can be used to both execute/configure machines
- very simple to write your own modules
- can be used into a push or pull model
- ... ansible.cc ... for more info
This is how you can use it within aws(ec2) to manage services.
# Install ansible via git
$ cd /tmp
$ git clone https://github.com/ansible/ansible.git
$ cd ansible
$ python setup.py install
$ pip install boto # used for the ec2 inventory
# setup aws variables
$ export ANSIBLE_HOSTS=/tmp/ansible/plugins/inventory/ec2.py # ec2 inventory
$ export AWS_ACCESS_KEY_ID='YOUR_AWS_API_KEY'
$ export AWS_SECRET_ACCESS_KEY='YOUR_AWS_API_SECRET_KEY'
# setup ssh access
$ ssh-agent
SSH_AUTH_SOCK=/tmp/ssh-dFUXvhH31724/agent.31724; export SSH_AUTH_SOCK;
SSH_AGENT_PID=31725; export SSH_AGENT_PID;
echo Agent pid 31725;
$ ssh-add /PATH_TO/YOUR_SSH_KEY_OR_PEM
# I use ec2-user onto a amazon linux
ansible -m ping all -u ec2-user
ec2-54-242-33-49.compute-1.amazonaws.com | success >> {
"changed": false,
"ping": "pong"
}
The ec2.py inventory has connected to the aws api and obtained all the instances running within the account that has the exported credentials AWS SECRET/KEY.
Then ansible used the ping module -m ping to ping the host(s). The ping module just connects via ssh to a host and reports pong with changed: false.
Now that we can connect let's see if we can leverage some of the metadata offered by AWS. My server runs into the security group ssh-web and to access this information from within ansible all you have to do is to use security_group_ssh-web. Where this come from is the ec2.py inventory script, if you run the script directly you will see something like this.
$ /tmp/ansible/plugins/inventory/ec2.py
{
"i-e4c9ca9c": [
"ec2-54-242-33-49.compute-1.amazonaws.com"
],
"key_mykey": [
"ec2-54-242-33-49.compute-1.amazonaws.com"
],
"security_group_ssh-web": [
"ec2-54-242-33-49.compute-1.amazonaws.com"
],
"tag_Name_srv01": [
"ec2-54-242-33-49.compute-1.amazonaws.com"
],
"type_t1_micro": [
"ec2-54-242-33-49.compute-1.amazonaws.com"
],
"us-east-1": [
"ec2-54-242-33-49.compute-1.amazonaws.com"
],
"us-east-1b": [
"ec2-54-242-33-49.compute-1.amazonaws.com"
]
}
In order to start the apache web server on all instances belonging to the ssh-web group is as simple as:
ansible -m service -a "name=httpd state=started" security_group_ssh-web -u ec2-user -s
ec2-54-242-33-49.compute-1.amazonaws.com | success >> {
"changed": true,
"name": "httpd",
"state": "started"
}
# notice -s which stands for use sudo without password
From here on sky is the limit, you can take a look at the docs site
http://ansible.cc/docs/ for more complex examples.