From d3c7c844fe7bf2b72d2eeadf541cff6b05579614 Mon Sep 17 00:00:00 2001 From: sabandi Date: Wed, 25 Aug 2021 09:49:09 +0530 Subject: [PATCH 1/3] Use new deployment model --- defaults/main.yml | 3 +- tasks/docker/services/install.yml | 8 +- tasks/docker/services/systemd/install.yml | 2 +- templates/avicontroller.j2 | 124 ++++++++++++++-------- templates/avicontroller.service.j2 | 14 +++ 5 files changed, 100 insertions(+), 51 deletions(-) create mode 100644 templates/avicontroller.service.j2 diff --git a/defaults/main.yml b/defaults/main.yml index ff3d86a..f9d8dc9 100644 --- a/defaults/main.yml +++ b/defaults/main.yml @@ -96,4 +96,5 @@ con_ports_list_all: "{{ con_ports_list_extras + con_ports_list_default }}" con_ports_list_string: "{% for port in con_ports_list_all|reject('match', '^$') %} -p {{ port }}{% endfor %}" # !!!! BEWARE: This is to completely override everything passed into the service template for the docker run. DON'T EDIT THIS UNLESS YOU KNOW WHAT YOUR DOING!!!!! -con_docker_run_params: "--name=avicontroller{{ con_ports_list_string }} -d --privileged{{ con_env_variables_string }}{{ con_mounts_string }} {{ con_image }}" +AVI_RUN_PARAMS: "--name=avicontroller{{ con_ports_list_string }} -d --privileged{{ con_env_variables_string }}{{ con_mounts_string }} {{ con_image }}" +AVI_EXECUTABLE: "/usr/sbin/avicontroller" diff --git a/tasks/docker/services/install.yml b/tasks/docker/services/install.yml index 9ee9425..b9c1a1c 100644 --- a/tasks/docker/services/install.yml +++ b/tasks/docker/services/install.yml @@ -1,8 +1,10 @@ --- -- name: Avi Controller | Services | systemd | Install the Avi Controller service - include: "systemd/install.yml" - when: ansible_service_mgr == "systemd" +- name: Avi Controller | Services | Install the Avi Controller service file | New + template: src=avicontroller.j2 dest=/usr/sbin/avicontroller mode=0755 + notify: Avi Controller | Services | Restart the avicontroller service +- name: Avi Controller | Services | {{ ansible_service_mgr }} | Install the Avi Controller service | New + include: "{{ ansible_service_mgr }}/install.yml" - name: Avi Controller | Services | {{ ansible_service_mgr }} | Start the service since it's not running | service: name=avicontroller enabled=yes state=started diff --git a/tasks/docker/services/systemd/install.yml b/tasks/docker/services/systemd/install.yml index 6c53f9f..12b0f91 100644 --- a/tasks/docker/services/systemd/install.yml +++ b/tasks/docker/services/systemd/install.yml @@ -1,7 +1,7 @@ --- - name: Avi Controller | Services | systemd | Deploy the avicontroller service template: - src: 16.x/avicontroller.service.j2 + src: avicontroller.service.j2 dest: /etc/systemd/system/avicontroller.service mode: 0644 register: avicontroller_service diff --git a/templates/avicontroller.j2 b/templates/avicontroller.j2 index 0ff0aeb..72037b1 100644 --- a/templates/avicontroller.j2 +++ b/templates/avicontroller.j2 @@ -1,104 +1,132 @@ #!/bin/bash -## Usage: avise [options] ARG1 + +## Usage: avicontroller [options] ARG1 ## Description: This script manages and provides manage of the Avi Controller service. -## Author: Eric Anderson +## docker is alias to the container platform i.e to either docker or podman +container=avicontroller +logfile="/var/log/${container}.log" -if [ -f /etc/default/avicontroller ]; then - . /etc/default/avicontroller -elif [ -f /etc/sysconfig/avicontroller ]; then - . /etc/sysconfig/avicontroller -else - echo "Failed to start: missing defaults" - exit 1 -fi +write_log() { + echo $1 2>&1 | tee -a ${logfile} +} +populate_container_platform() +{ + # Default container platform is docker + cont_plat="docker" + cont_plat_sock="/var/run/docker.sock" + + # Possible values for $distribution which we support + # "ubuntu" (or) "ol" (or) "rhel" (or) "centos" + distribution=$(grep "^ID=" /etc/os-release | cut -d"=" -f2 | sed 's/"//g') + + # Possible known values for $version which we support + # On Ubuntu: + # version = "16.04" (or) "18.04" (or) "20.04" + # On RHEL / OL / CENTOS: + # version = "7.*" (or) "8.*" + version=$(grep "^VERSION_ID=" /etc/os-release | cut -d"=" -f2 | sed 's/"//g') + + # cont_plat is podman only on OL / RHEL / CENTOS 8.* + if [[ $distribution == "ol" || $distribution == "centos" || $distribution == "rhel" ]]; then + if [[ $version =~ 8.* ]]; then + cont_plat="podman" + cont_plat_sock="/run/podman/podman.sock" + fi + fi + write_log "[`date`] Setting cont_plat to $cont_plat as distribution=$distribution ($version)" +} -write_log() { - echo $1 2>&1 | tee -a ${AVICONTROLLER_LOGFILE} +wait_till_service_starts() +{ + service=$1 + write_log "[`date`] Waiting to check if ${service}.service is active" + while [[ $(systemctl is-active ${service}.service) != "active" ]] + do + sleep 1 + done + write_log "[`date`] ${service}.service is active" } container_running() { - /usr/bin/docker ps -f name=avicontroller | grep -q avicontroller + ${cont_plat} ps -f name=${container} | grep -q ${container} } container_exists() { - /usr/bin/docker ps -a -f name=avicontroller | grep -q avicontroller + ${cont_plat} ps -a -f name=${container} | grep -q ${container} } start_container() { - write_log "[`date`] Starting the avicontroller container" - /usr/bin/docker run ${AVICONTROLLER_DOCKER_RUN_PARAMS} + write_log "[`date`] Starting the ${container} container" + ${cont_plat} run ${controller_docker_run_params} if [ $? -eq 0 ]; then - write_log "[`date`] Service avicontroller running..." + write_log "[`date`] Service ${container} running..." else - write_log "[`date`] Failed to start the avicontroller container" + write_log "[`date`] Failed to start the ${container} container" exit 1 fi } stop_container() { - /usr/bin/docker stop -t 60 avicontroller + ${cont_plat} stop ${container} if [ $? -eq 0 ]; then - write_log "[`date`] Stopped the avicontroller container" + write_log "[`date`] Stopped the ${container} container" else exit 1 fi } remove_container() { - write_log "[`date`] Removing existing avicontroller container" - /usr/bin/docker rm -f avicontroller + write_log "[`date`] Removing existing ${container} container" + ${cont_plat} rm -f ${container} if [ $? -eq 0 ]; then - write_log "[`date`] Removed existing avicontroller container" + write_log "[`date`] Removed existing ${container} container" else - write_log "[`date`] Failed to remove existing avicontroller container" + write_log "[`date`] Failed to remove existing ${container} container" fi } prestart() { # Clean up any running or existing avicontroller containers - write_log "[`date`] Performing avicontroller pre-start step." - if container_running && container_exists; then - write_log "[`date`] Service avicontroller is already running." - elif ! container_running && container_exists; then - write_log "[`date`] Container avicontroller already exists, but not running. This can be caused by an - improper shutdown, or service crash. Performing cleanup" - remove_container - start_container - else - start_container - fi + write_log "[`date`] Performing ${container} pre-start step." + remove_container + start_container } start() { prestart - /usr/bin/docker wait avicontroller + ${cont_plat} wait ${container} } stop() { - # Stopping the docker process if running + # Stopping the docker/podman process if running + controller_pid=`${cont_plat} inspect $container | grep '\"Pid\"' | awk '{print $2}' | sed s/,//` + stop_var="fstrim /proc/$controller_pid/root" + ${stop_var} + write_log "[`date`] Freed the blocks of ${controller_pid}..." if container_running; then - write_log "[`date`] Service avicontroller stopping..." + write_log "[`date`] Service ${container} stopping..." stop_container else - write_log "[`date`] Service avicontroller already stopped" + write_log "[`date`] Service ${container} already stopped" fi poststop } poststop() { - if $(ip addr | grep -q ${AVICONTROLLER_DEV_NAME}:avivip); then - /bin/bash -c "ip addr del $(ip addr | grep ${AVICONTROLLER_DEV_NAME}:avivip | awk '{print $2}') dev ${AVICONTROLLER_DEV_NAME}" + if $(ip addr | grep -q {{ AVICONTROLLER_DEV_NAME }}:avivip); then + /bin/bash -c "ip addr del $(ip addr | grep {{ AVICONTROLLER_DEV_NAME }}:avivip | awk '{print $2}') dev {{ AVICONTROLLER_DEV_NAME }}" if [ $? -eq 0 ]; then write_log "[`date`] Successfuly removed the cluster vip interface." fi - elif $(ip addr | grep -q ${AVICONTROLLER_DEV_NAME}:1); then - /bin/bash -c "ip addr del $(ip addr | grep ${AVICONTROLLER_DEV_NAME}:1 | awk '{print $2}') dev ${AVICONTROLLER_DEV_NAME}" + elif $(ip addr | grep -q {{ AVICONTROLLER_DEV_NAME }}:1); then + /bin/bash -c "ip addr del $(ip addr | grep {{ AVICONTROLLER_DEV_NAME }}:1 | awk '{print $2}') dev {{ AVICONTROLLER_DEV_NAME }}" if [ $? -eq 0 ]; then write_log "[`date`] Successfuly removed the cluster vip interface." fi fi + if container_exists; then remove_container fi @@ -115,14 +143,18 @@ reload() { status() { if container_running; then - echo "avicontroller running..." + echo "${container} running..." else - echo "avicontroller stopped" + echo "${container} stopped" fi } + case "$1" in start|stop|status|restart|reload) + populate_container_platform + wait_till_service_starts ${cont_plat} + controller_docker_run_params="{{ AVI_RUN_PARAMS }}" $1 ;; *) @@ -130,4 +162,4 @@ case "$1" in exit 2 esac -exit $? +exit $? \ No newline at end of file diff --git a/templates/avicontroller.service.j2 b/templates/avicontroller.service.j2 new file mode 100644 index 0000000..9606829 --- /dev/null +++ b/templates/avicontroller.service.j2 @@ -0,0 +1,14 @@ +[Unit] +Description=AviCONTROLLER +Requires=proc-sys-fs-binfmt_misc.mount + + +[Service] +TimeoutStartSec=0 +Restart=always + +ExecStart={{ AVI_EXECUTABLE }} start +ExecStop={{ AVI_EXECUTABLE }} stop + +[Install] +WantedBy=multi-user.target \ No newline at end of file From 39680ea09278789523a0de0b0bcb52ebb352b8b9 Mon Sep 17 00:00:00 2001 From: sabandi Date: Wed, 25 Aug 2021 12:30:00 +0530 Subject: [PATCH 2/3] set the dev name --- templates/avicontroller.j2 | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/templates/avicontroller.j2 b/templates/avicontroller.j2 index 72037b1..5653ab1 100644 --- a/templates/avicontroller.j2 +++ b/templates/avicontroller.j2 @@ -7,6 +7,11 @@ container=avicontroller logfile="/var/log/${container}.log" +# The following value is the management device that the controller will use. +# This interface is managed by the service and is used when working with clusters +# to properly shut down the sub-interface when a new master is chosen. +AVICONTROLLER_DEV_NAME="{{ con_dev_name }}" + write_log() { echo $1 2>&1 | tee -a ${logfile} } From 40a54c06f08293951d6e7651c8603e0e9aeee585 Mon Sep 17 00:00:00 2001 From: sabandi Date: Wed, 25 Aug 2021 12:47:31 +0530 Subject: [PATCH 3/3] set the dev name during play execution --- tasks/docker/con_requirements.yml | 1 + templates/avicontroller.j2 | 5 ----- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/tasks/docker/con_requirements.yml b/tasks/docker/con_requirements.yml index 43ad929..c19dead 100644 --- a/tasks/docker/con_requirements.yml +++ b/tasks/docker/con_requirements.yml @@ -28,6 +28,7 @@ - name: Avi Controller | Requirements | Set the management device name | ip addr set_fact: con_dev_name: "{{ con_mgmt_device.stdout }}" + AVICONTROLLER_DEV_NAME: "{{ con_mgmt_device.stdout }}" when: con_dev_name == None - name: Avi Controller | Requirements | Set max_cores and memory limits of environment diff --git a/templates/avicontroller.j2 b/templates/avicontroller.j2 index 5653ab1..72037b1 100644 --- a/templates/avicontroller.j2 +++ b/templates/avicontroller.j2 @@ -7,11 +7,6 @@ container=avicontroller logfile="/var/log/${container}.log" -# The following value is the management device that the controller will use. -# This interface is managed by the service and is used when working with clusters -# to properly shut down the sub-interface when a new master is chosen. -AVICONTROLLER_DEV_NAME="{{ con_dev_name }}" - write_log() { echo $1 2>&1 | tee -a ${logfile} }