Skip to content

Instantly share code, notes, and snippets.

@platu
Last active March 24, 2024 13:33
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save platu/f6fa79855e21e5c1f50c50d1282f2b3d to your computer and use it in GitHub Desktop.
Save platu/f6fa79855e21e5c1f50c50d1282f2b3d to your computer and use it in GitHub Desktop.
IaC Lab 3 Ansible prepare stage playbook
---
- name: PREPARE LAB ENVIRONMENT
hosts: hypervisors
tasks:
- name: ENSURE SYMLINK TO MASTERS DIRECTORY EXISTS
ansible.builtin.file:
src: /var/cache/kvm/masters
dest: "{{ ansible_env.HOME }}/masters"
state: link
- name: ENSURE VM DIRECTORY EXISTS
ansible.builtin.file:
path: "{{ ansible_env.HOME }}/vm"
state: directory
mode: "0755"
- name: ENSURE SYMLINK TO SCRIPTS DIRECTORY EXISTS
ansible.builtin.file:
src: /var/cache/kvm/masters/scripts
dest: "{{ ansible_env.HOME }}/vm/scripts"
state: link
- name: ENSURE LAB DIRECTORY EXISTS
ansible.builtin.file:
path: "{{ ansible_env.HOME }}/vm/{{ lab_name }}"
state: directory
mode: "0755"
- name: CHECK IF TAP INTERFACES ARE ALREADY USED BY ANOTHER USER
ansible.builtin.shell:
cmd: |
set -o pipefail
if $(pgrep -vafu $USER | grep -q "={{ item.name }},"); then
echo "{{ item.name }} is already in use by another user."
exit 1
fi
exit 0
executable: /bin/bash
register: result
failed_when: result.stdout.find("already in use") >= 0
changed_when: result.rc != 0
when:
# only run the task if the tap interface already exists on hypervisor
- item.name in ansible_facts.interfaces
with_items:
- "{{ hostvars[inventory_hostname].taps }}"
- name: CONFIGURE TAP INTERFACES SWITCH CONNECTION
ansible.builtin.shell:
cmd: |
# exit if the defined switch does not exist
switches_list=$(sudo ovs-vsctl list-br)
if ! grep -q "{{ item.switch }}" <<< "${switches_list}"; then
exit 1
fi
# Check if the port is already connected to the defined switch
actual_switch=$(sudo ovs-vsctl port-to-br {{ item.name }})
if [[ ${actual_switch} != "{{ item.switch }}" ]]; then
sudo ovs-vsctl del-port ${actual_switch} {{ item.name }}
sudo ovs-vsctl add-port {{ item.switch }} {{ item.name }}
echo "Port {{ item.name }} connected to {{ item.switch }}"
fi
exit 0
executable: /bin/bash
register: result
when:
# only run the task if the tap interface already exists on hypervisor
- item.name in ansible_facts.interfaces
# changed when the "connected to" message is found in the output
changed_when: result.stdout.find("connected to") != -1
failed_when: result.rc != 0 or item.name not in ansible_facts.interfaces
with_items:
- "{{ hostvars[inventory_hostname].taps }}"
- name: CONFIGURE TAP INTERFACES IN ACCESS MODE
ansible.builtin.shell:
cmd: |
# Check if the port is already configured with the defined vlan mode
actual_mode=$(sudo ovs-vsctl get port {{ item.name }} vlan_mode)
if [[ ${actual_mode} != "{{ item.vlan_mode }}" ]]; then
sudo ovs-vsctl set port {{ item.name }} vlan_mode="{{ item.vlan_mode }}"
echo "Port {{ item.name }} vlan mode changed to {{ item.vlan_mode }}"
fi
# Check if the port is already configured with the defined vlan tag
actual_tag=$(sudo ovs-vsctl get port {{ item.name }} tag)
if [[ ${actual_tag} != "{{ item.tag }}" ]]; then
sudo ovs-vsctl set port {{ item.name }} tag="{{ item.tag }}"
echo "Port {{ item.name }} tag changed to {{ item.tag }}"
fi
exit 0
executable: /bin/bash
register: result
# changed when the "changed to" message is found in the output
changed_when: result.stdout.find("changed to") != -1
# tag attribute is mandatory for access mode
failed_when: item.tag is not defined
when:
# only run the task if the tap interface already exists
- item.name in ansible_facts.interfaces
# access mode is selected
- item.vlan_mode is defined and item.vlan_mode == "access"
- item.tag is defined
with_items:
- "{{ hostvars[inventory_hostname].taps }}"
- name: CONFIGURE TAP INTERFACES IN TRUNK MODE
ansible.builtin.shell:
cmd: |
# Check if the port is already configured with the defined vlan mode
actual_mode=$(sudo ovs-vsctl get port {{ item.name }} vlan_mode)
if [[ ${actual_mode} != "{{ item.vlan_mode }}" ]]; then
sudo ovs-vsctl set port {{ item.name }} vlan_mode="{{ item.vlan_mode }}"
echo "Port {{ item.name }} vlan mode changed to {{ item.vlan_mode }}"
fi
# Check if the port is already configured with the defined vlan tag
actual_trunks=$(sudo ovs-vsctl get port {{ item.name }} trunks)
if [[ "${actual_trunks}" != "{{ item.trunks }}" ]]; then
sudo ovs-vsctl set port {{ item.name }} trunks="{{ item.trunks }}"
echo "Port {{ item.name }} vlan list changed to {{ item.trunks }}"
fi
exit 0
executable: /bin/bash
register: result
# changed when the "changed to" message is found in the output
changed_when: result.stdout.find("changed to") != -1
# trunks attribute is mandatory for trunk mode
failed_when: item.trunks is not defined
when:
# only run the task if the tap interface already exists
- item.name in ansible_facts.interfaces
# trunk mode is selected
- item.vlan_mode is defined and item.vlan_mode == "trunk"
- item.trunks is defined
with_items:
- "{{ hostvars[inventory_hostname].taps }}"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment