Version 37 (modified by 10 years ago) (diff) | ,
---|
Converting the Hello GENI Install Script to Ansible
4. Configure and Initialize
omni
comes with a script, readyToLogin
which finds the login information for nodes in your slice. As of omni
version 2.8, readyToLogin
has an --ansible-inventory
flag which generates the Ansible inventory, which is a flat file which tells Ansible the name and login information for your nodes.
- Create your Ansible inventory file:
On your local machine:
$ readyToLogin MYSLICE --useSliceAggregates --ansible-inventory -o $ cat inventory
Example output of running these commands:
$ readyToLogin ansible --useSliceAggregates --ansible-inventory -o Host info saved in inventory file: /Users/jdoe/projects/GENI/hellogeni/inventory $ cat inventory client ansible_ssh_host=pc3.instageni.clemson.edu ansible_ssh_port=33850 server ansible_ssh_host=pcvm3-6.instageni.clemson.edu
- Check to see if your nodes are up and ready.
This command uses the
ping
module to ping the specified nodes (in this caseall
) listed in the inventory file:$ ansible -i inventory all -m ping
Example output showing all of the nodes responding to ping:
$ ansible -i inventory all -m ping client | success >> { "changed": false, "ping": "pong" } server | success >> { "changed": false, "ping": "pong" }
- Try using the ping module in Ansible to only ping
server
orclient
by replacingall
in the above withserver
orclient
.
5. Execute Experiment
The following are some example Ansible Ad Hoc commands. You can run these commands one at a time from the machine where you have Ansible installed. `-s` tells Ansible to use `sudo` when executing the command. |
apt
module is used to installed packages:
ansible [-i inventory] [all/server/client] -s -m apt -a "name=apache2 update_cache=yes"
shell
module is used to execute an arbitrary shell command:
ansible [-i inventory] [all/server/client] -s -m shell -a "/usr/sbin/a2enmod status"
file
module is used to manipulate files:
ansible [-i inventory] [all/server/client] -s -m file -a "path=/var/www/html state=absent"
synchronize
module is an implementation of rsync
and is used to efficiently synchronize files between your local machine and the node:
ansible [-i inventory] [all/server/client] -s -m synchronize \ -a "src=website/index.html dest=/var/www"
lineinfile
module is used to see if an arbitrary line exists in a file:
ansible [-i inventory] [all/server/client] -s -m lineinfile \ -a "line='ExtendedStatus On' dest=/etc/apache2/conf.d/extendedstatus create=yes state=present"
service
module is used to start/stop/restart/etc services:
ansible [-i inventory] [all/server/client] -s -m service -a "name=apache2 state=restarted"
- Using the above Ad Hoc Ansible commands do the following:
- on both
client
andserver
, installapache2
andiperf
- on the
client
node, place thescripts
directory in/local
with permissions755
.
- on both
Ansible commands can be collected into files called Playbooks. Playbooks are in a configuration file format called YAML which is very straightforward. In particular, Ansible Ad Hoc commands easily map to commands used in an Ansible Playbook. |
Use the `name` construct to leave a comment describing the Ansible command you are running. |
The commands to configure the client
node as in the install script are as follows:
--- - name: Configure client hosts: client sudo: True tasks: - name: install apache2 apt: name=apache2 update_cache=yes - name: install iperf apt: name=iperf update_cache=yes - name: copy scripts into /local with permissions 755 synchronize: src=scripts dest=/local mode=755
Do these commands look like the Ad Hoc commands you came up with in the previous step?
Put the above content in a file called hello-client.yml
.
Run the playbook with the following command on the local machine:
ansible-playbook hello-client.yml -i inventory
- Using the above Ansible modules, reproduce the steps in the HelloGENI install script for the
server
node. As you find a command that works, use it to construct ahello-server.yml
playbook. (For the solution see: HERE) - Run both the
client
andserver
playbooks on your nodes. - Browse to the server node (as in the original HelloGENI example). Do you see the same behavior you saw when you ran the original HelloGENI exercise?
6. Analyze Experiment
- You may have noticed that the server playbook and the client playbook contained duplicate text. This is because both nodes need to have apache installed so that they can act as webservers. As you might have guessed, there is a way to modularize this configuration. In Ansible this is done with "roles".
- MORE HERE