wiki:GENIExperimenter/Tutorials/AnsibleHelloGENI/Execute

Version 35 (modified by sedwards@bbn.com, 4 years ago) (diff)

--

Converting the Hello GENI Install Script to Ansible

Image Map

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.

  1. 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
    
  2. Check to see if your nodes are up and ready.

    This command uses the ping module to ping the specified nodes (in this case all) listed in the inventory file:

    $ ansible all -m ping -i inventory
    

    Example output showing all of the nodes responding to ping:

    $ ansible all  -m ping -i inventory
    client | success >> {
        "changed": false,
        "ping": "pong"
    }
    
    server | success >> {
        "changed": false,
        "ping": "pong"
    }
    
  3. Try using the ping module in Ansible to only ping server or client by replacing all in the above with server or client.

5. Execute Experiment

Tip 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"
  1. Using the above Ad Hoc Ansible commands do the following:
    1. on both client and server, install apache2 and iperf
    2. on the client node, place the scripts directory in /local with permissions 755.
Tip 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.
Tip 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
  1. 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 a hello-server.yml playbook.
  2. Run both the client and server playbooks on your nodes.
  3. 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

  1. 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".
  2. MORE HERE

Introduction/DesignSetup

Next: Finish