# Install a Ubuntu 16.04 Xenial Guest on an RGnet Cluster

For this example, I will use the vm/host name random.sea.rg.net on the Westin cluster.  Modify to suit your needs.

Before I start the install, I put the new host in the DNS so that it has time to propagate.

## Create the VM and do the Ubuntu Install

I cheat and use a script.

```
vm0.sea.rg.net:/root# ./do-add vm0 32 4 random.sea.rg.net
Sat Feb 11 23:54:11 2017 * disk 0, size 32.0G
Sat Feb 11 23:54:11 2017 * creating instance disks...
Sat Feb 11 23:54:13 2017 adding instance random.sea.rg.net to cluster config
Sat Feb 11 23:54:13 2017 adding disks to cluster config
Sat Feb 11 23:54:14 2017  - INFO: Waiting for instance random.sea.rg.net to sync disks
Sat Feb 11 23:54:14 2017  - INFO: Instance random.sea.rg.net's disks are in sync
Sat Feb 11 23:54:14 2017  - INFO: Waiting for instance random.sea.rg.net to sync disks
Sat Feb 11 23:54:14 2017  - INFO: Instance random.sea.rg.net's disks are in sync
```

Find the VNC console of the new VM

```
vm0.sea.rg.net:/root# gnt-instance info random.sea.rg.net | grep console
  console connection: vnc to 127.0.0.1:11038 (node vm0.sea.rg.net) (display 5138)
    serial_console: default (True)
```

Remember that 11038 for VNC.

Spin up the VM but boot from the Ubuntu install CD-ROM

```
gnt-instance start -H boot_order=cdrom,cdrom_image_path=/ISOs/ubuntu-16.04.1-server-amd64.iso random.sea.rg.net
```

From your local host, go for the VNC concole over a nice safe ssh tunnel.  Tunnel to vm0.ea.rg.net because that is where the instance lives.

```
$ ssh -N -L 5900:127.0.0.1:11038 vm0.sea.rg.net
```

On my local host, a Mac, I start a VNC client (I use Chicken of the VNC) to localhost, port 5900, display 0, with the password of vnc on the target ganeti node.

1Do the Ubuntu install on the VNC GUI.  The options I choose are:

- US English and US keyboard.  This means I am not offered the UTC timezone option and have to set manually later.  But it sets the `/etc/apt/sources.list` to the US servers.

- Manually set the IP address, but some folk like DHCP.

- Use the entire disk with LVM so that it is easy to expand later.

- Automatic security updates, but I will hack this further later.

- OpenSSH server as well as the standard system utilities

- Install the GRUB boot loader so that I can make serial console work

## Reboot the VM

The installation completes, and the darn thing reboots the CD-ROM.  So I get brutal, and back on the VM node I

```
gnt-instance reboot --shutdown-timeout=3 random.sea.rg.net 
```

This usually whacks my VNC session, so I have to restart the client.

Because I did not use DHCP but set the address manually, I know where the host is.  Because I have never figured out how to paste into the VNC client, I immediately ssh into the new system as the new user.

## First Configuration

The first thing is set the password to something nasty.  Ivyuams8

Then I become root, and get the software current.

```
randy@random:~$ sudo bash
root@random:~# apt update
root@random:~# apt upgrade
```

This can take a while.

## Customize VM

If it does not run Emacs, it is not a computer.  And install unbound so we have a local nameserver, and ntpd so we have a local chime.  We will do detailed configuration of unbound and ntp later.

```
apt install emacs-nox unbound ntp
chown -R unbound:unbound /etc/unbound/
```

I set root's password to something nasty so that I can get in over the serial console if things get wedged during operation.

I want to disable ssh passwording as soon as reasonable, so I install root's ssh credentials.  These are not real.

```
cd /root
mkdir .ssh
chmod 700 .ssh
cat > .ssh/authorized_keys
ssh-ed25519 AAAAC3NzaC1lZDI1NE5AAAAIDzOVboz/9daQwQRPkxD/TD4PZ4ZVNgMLqd+zc79Gl+ randy@ryuu.psg.com
ssh-rsa   randy@ryuu.psg.com
chmod 600 .ssh/authorized_keys 
```

Copy the ssk authority to the user account

```
rsync -vlpPStgoHxr .ssh ~randy
chown -R randy:randy ~randy
```

I want my standard dot files, so I go to a recently customized Xenial system and rsync them over.

```
rsync -vlpPStgoHx .bashrc .emacs .exrc .forward .inputrc randy@random.sea:
ssh randy@random.sea chown -R randy:randy .
rsync -vlpPStgoHx .bashrc .emacs .exrc .forward .inputrc root@random.sea:
ssh root@random.sea chown -R root:root .
```

And a bit of decoration from the other system

```
rsync -vlpPStgoHx /usr/bin/xtitle root@random.sea:/usr/bin/xtitle
```

## Configure GRUB and the Network

Configure GRUB for

- longer timeout
- serial console
- use ntp not kvm clock
- make the base ether eth0 instead of ens5

Edit /etc/default/grub

```
GRUB_TIMEOUT=6
...
GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0 console=tty0 console=ttyS0,9600n8 no-kvmclock"
...
GRUB_TERMINAL="console serial"
GRUB_SERIAL_COMMAND="serial --speed=115200 --unit=0 --word=8 --parity=no --stop=1"
```

And remember to update GRUB

```
update-grub
```

IMMEDIATELY udate /etc/network/interfaces to change the name of the ethernet to eth0 and any other tunings.

```
auto eth0
iface eth0 inet static
  address 147.28.0.2/24
  gateway 147.28.0.1
  dns-nameserver 127.0.0.1
  dns-nameserver 147.28.0.35
  dns-search rg.net psg.com

iface eth0 inet6 static
  address 2001:418:1::2/64
  gateway 2001:418:1::1
```

## Last Cosmetics Before Reboot

Edit `/etc/hostname` to fill out the full FQDN.

Set the timezone.  All my servers are in UTC

```
dpkg-reconfigure tzdata
```

I still have the VNC console open, so it would be a good time to reboot and watch for problems.  I could tell the VM to reboot, or whack it from the Ganeti master.  To ensure it is really clean, I do the latter.  I do not force the timeout so I can ensure that APCI works.

```
gnt-instance reboot random.sea.rg.net 
```

## Use Ansible to Install and Configure a Bunch of Things

First, to use Ansible, the host must have python2, and have it linked to be `python`

```
apt install python2.7
ln /usr/bin/python2.7 /usr/bin/python
```

Now the barrage of ansible, which for me is based on my Mac laptop.

```
ansible-playbook -l random.sea.rg.net ntpd.yml
ansible-playbook -l random.sea.rg.net no-depends.yml 
ansible-playbook -l random.sea.rg.net snmpd.yml
ansible-playbook -l random.sea.rg.net syslog-ng.yml 
ansible-playbook -l random.sea.rg.net unattended-upgrades.yml 
ansible-playbook -l random.sea.rg.net unbound.yml 
```

## Add the VM to Infrastructure Monitoring Etc.

Create an entry in `srv0.iad.rg.net:/etc/nagios3/conf.d` and enable checks in the GUI

Add the device to snmp monitoring `https://nms.rg.net/`

And finally, use Exim as the mail transport and install a client.

```
apt install exim4 mailutils
dpkg-reconfigure exim4-config
```

Edit `/etc/aliases` to send root mail where you really want it to go, and run `newaliases`