Ansible KVM Router Lab Part 2
date: 2021-10-16
Introduction
This is Part 2 of a multi-part series of blog posts for building a router lab automatically using a series of bash scripts and ansible.
Ansible KVM Router Lab Part 1 is an overview.
In this post I begin breaking down the bash scripts which build the router lab, beginning with build_vms.bash.
In Ansible KVM Router Lab Part 3, I explain define_bridge_networks.bash and shutdown_vms.bash scripts which are used to construct the lab.
In Ansible KVM Router Lab Part 4, I explain connect_vms_to_bridges.bash, start_vms.bash, and rebuild_known_hosts.bash scripts which are used to construct the lab.
In Ansible KVM Router Lab Part 5, I explain the ansible playbook tasks used to finish building the lab.
In Ansible KVM Router Lab Part 6, I explain disconnect_vms_from_bridges.bash, undefine_and_remove_vms.bash, and remove_bridge_networks which are used to destroy the lab.
build_vms.bash
check_uid "0"
build_vms.bash
begins by making sure that it is run as the root user. This is because root is required to
ssh into the clones to change their hostnames, machine-ids, and host-ssh-keys. You can call
with sudo bash build_vms.bash
.
For this same reason, ~/.ssh/known_hosts
is useless so it is deleted (and then rebuilt).
function build_vms()
Next,
build_vms.bash
calls build_vms
, which loops over the array of MACHINES, which is an
array that holds that names of the lab clients, passing each name in turn
to create_vm
.
create_vm
creates the virtual machine if it does not already exist, using virt-clone
, and
then calls start_vm
to start it.
start_vm
is exported from
env.bash,
and per parsing the output of virsh list --inactive
, starts the virtual machine if it is not running.
function set_hostnames()
Next,
build_vms.bash
calls set_hostnames
, which simultaneously calls set_hostname
on the entire MACHINES array. set_hostname
in turn waits for the virtual machine to be fully booted, then updates the files /etc/hostname
and
/etc/hosts
, and then reboots the virtual machine to apply the new hostname.
function confirm_hostnames()
confirm_hostnames
simultaneously calls confirm_hostname
against the entire MACHINES array.
confirm_hostname
waits for the virtual machine to be fully booted, then confirms the correct
hostname in /etc/hostname
.
function confirm_hostnames_in_hosts()
confirm_hostnames_in_hosts
works almost exactly the same as confirm_hostnames
, but this time
the file /etc/hosts
on the virtual machine is grepped for the proper hostname, and corrected
if necessary.
function reset_hosts_ssh_keys()
reset_hosts_ssh_keys
simultaneously calls reset_host_ssh_keys
against the MACHINES array,
which in turn compares the host_ssh_key of the virtual machine against the bas3 virtual
machine, and if necessary deletes /etc/ssh/ssh_host_*
, generates new host_ssh_keys, restarts
sshd
on the virtual machine, removes ~/.ssh/known_hosts
, and then reruns itself in
order to confirm the new host_ssh_keys.
function reset_machine_ids()
reset_machine_ids
simultaneously calls reset_machine_id
against the entire MACHINES array,
which in turn checks the machine-id of the virtual machine to make sure that it is different
than the machine-id of the base virtual machine, and if necessary deletes
/etc/machine-id
and /var/lib/dbus/machine-id
and recreates them.
To Be Continued
In Ansible KVM Router Lab Part 3, I explain define_bridge_networks.bash and shutdown_vms.bash scripts which are used to construct the lab.