Context Navigation

STEPS FOR SETTING UP

1. Get a GEE Slicelet and download GEE helper files

Visit ​http://gee-project.org and login. Once logged in, click on Get a slicelet. Reload the dashboard every few seconds until the slice is in state Running -- this should take about 30 seconds. Then click on Download Slicelet File to download the GEE helper files. Unpack the tarball and take a look at README.txt.

2. Learn about GEE networking

Pick a node from your ssh-config file and log in to it with SSH. For example:

This IP address is behind a NAT and not directly reachable from outside (i.e., from the Internet). However all nodes in your slicelet can contact each other using the private addresses.

The nodes in your ssh-config file are Docker containers running on (virtual) hosts. These hosts have public IP addresses that are routable from the Internet, that's why you can login to the Docker containers of your slicelet. A port on the public IP address (e.g., 49155) is forwarded to the SSH port (22) on the container's private IP address. The ssh-config file contains the names of the virtual hosts and the port forwarding information.

When you run a server on a node in your slicelet, it will listen on the private address, because that is the only one it can see. By default it will only be visible to other nodes in your slicelet. Docker provides facilities for exposing ports to the public Internet, but this topic is outside the scope of this tutorial.

Note that later on you will need to find both the public and private IP addresses for each node in the slicelet.

3. Configure the Ansible controller for your slicelet

If you already have Ansible installed on your laptop, then you can use it as the controller for this experiment. Otherwise, you will use one of the nodes in your slicelet as the Ansible controller. Pick one, log into it, and install ansible using apt-get:

$ apt-get update
$ apt-get install ansible

Then upload your slicelet helper files to that node. scp can be used for this

4. Learn some basic concepts of Ansible

Ansible (​http://docs.ansible.com) is a free, open-source, intuitive IT automation tool that is well-suited to the tasks in this tutorial. Ansible commands can be run from the command line or put in a YAML file called a playbook. We will be creating an Ansible playbook to run the parameterized HTTP query described earlier.

Two basic concepts in Ansible are inventories and modules. An inventory is a list of hosts to be managed by Ansible, organized into groups. When you run Ansible commands, either from the command-line or in a playbook, you specify the host group that the command should operate on. In this way Ansible commands can operate on many hosts in parallel. Take a look at the Ansible inventory in your ansible-hosts file. This is basically the equivalent of the ssh-config except its specialized for Ansible.

A task in Ansible consists of a module and some arguments for the module. A module provides a declarative abstraction on top of standard shell commands. So for example, in the shell on an Ubuntu machine you might install package “foo” like this:

$ sudo apt-get update
$ sudo apt-get install foo

An equivalent Ansible task in a playbook would look like:

- apt: name=foo state=latest update_cache=yes

Or the same Ansible task could be invoked directly on the command line like this:

The task uses the apt module, and tells Ansible: “Make sure the latest version of package foo is installed”. There are many other modules which are well-documented at ​http://docs.ansible.com.

Here are a few Ansible tasks to run, to get some experience with the command-line interface.

(a) The ping module

The ping module simply tries to do a SSH login to a node and reports success or failure. Run the following command on your controller:

$ ansible nodes -i ansible-hosts -m ping

If you don’t see success everywhere then there is something wrong with your setup. Ask one of the tutorial leaders for help.

(b) The shell module

The shell module lets you run arbitrary SSH commands in parallel across a set of hosts. It’s useful for poking around, or if there is no Ansible module with the functionality you need. Try it out:

$ ansible nodes -i ansible-hosts -m shell -a "hostname"

You can replace hostname above with any other Linux command.

(c) The setup module

The setup module gathers a bunch of information about each node and saves it in variables that you can reference in your Ansible playbooks. This will be really useful to do the tutorial! Try it out on a node to see what it collects (replace <your-slicelet> with your slicelet’s name):

The setup module is run automatically at the beginning of a playbook to populate variables for each node. The above playbook will dump the value of each node’s ansible_hostname variable. To run the playbook on a single node, replace nodes with the name of one of your slice nodes (e.g., slice338.pcvm3-7.instageni.nps.edu).

5. Create and run an Ansible playbook to install the software you'll need

Now you should have enough knowledge about Ansible to write a playbook to install the software you'll need on all the nodes. Below is a skeleton Ansible file that you use (download​). You will need to fill in the bits marked # INSERT ARGUMENTS HERE based on the instructions in the following section. If you get stuck at any point, you can take a look at this solution​.