From ab9f652113243c38bef59b907e6729ea5d17f9e0 Mon Sep 17 00:00:00 2001 From: Sam Yaple Date: Fri, 24 Jul 2015 14:59:25 +0000 Subject: [PATCH] Add keepalived to ansible Adds the needed ansible bits to support keepalived Closes-Bug: #1479934 Change-Id: Iace29b23a0e923b1f5dc9a4f5bc0f88afce3ae62 Partially-Implements: blueprint ansible-service --- ansible/roles/haproxy/defaults/main.yml | 11 ++++++ ansible/roles/haproxy/tasks/config.yml | 11 ++++++ ansible/roles/haproxy/tasks/start.yml | 10 ++++++ .../haproxy/templates/keepalived.conf.j2 | 19 +++++++++++ docker/centos/binary/keepalived/Dockerfile | 3 +- .../binary/keepalived/config-external.sh | 1 + .../binary/keepalived/config-internal.sh | 1 + docker/common/keepalived/config-external.sh | 11 ++++++ docker/common/keepalived/config-internal.sh | 31 +++++++++++++++++ docker/common/keepalived/start.sh | 34 +++++-------------- 10 files changed, 105 insertions(+), 27 deletions(-) create mode 100644 ansible/roles/haproxy/templates/keepalived.conf.j2 create mode 120000 docker/centos/binary/keepalived/config-external.sh create mode 120000 docker/centos/binary/keepalived/config-internal.sh create mode 100755 docker/common/keepalived/config-external.sh create mode 100755 docker/common/keepalived/config-internal.sh diff --git a/ansible/roles/haproxy/defaults/main.yml b/ansible/roles/haproxy/defaults/main.yml index 1d8b444a62..910ddd4c89 100755 --- a/ansible/roles/haproxy/defaults/main.yml +++ b/ansible/roles/haproxy/defaults/main.yml @@ -14,3 +14,14 @@ kolla_haproxy_container_name: "haproxy" docker_haproxy_image: "{{ docker_haproxy_registry }}{{ docker_haproxy_namespace }}/{{ kolla_haproxy_base_distro }}-{{ kolla_haproxy_install_type }}-{{ kolla_haproxy_container_name }}" docker_haproxy_tag: "{{ openstack_release }}" docker_haproxy_image_full: "{{ docker_haproxy_image }}:{{ docker_haproxy_tag }}" + + +docker_keepalived_registry: "{{ docker_registry }}" +docker_keepalived_namespace: "{{ docker_namespace }}" +kolla_keepalived_base_distro: "{{ kolla_base_distro }}" +kolla_keepalived_install_type: "{{ kolla_install_type }}" +kolla_keepalived_container_name: "keepalived" + +docker_keepalived_image: "{{ docker_keepalived_registry }}{{ docker_keepalived_namespace }}/{{ kolla_keepalived_base_distro }}-{{ kolla_keepalived_install_type }}-{{ kolla_keepalived_container_name }}" +docker_keepalived_tag: "{{ openstack_release }}" +docker_keepalived_image_full: "{{ docker_keepalived_image }}:{{ docker_keepalived_tag }}" diff --git a/ansible/roles/haproxy/tasks/config.yml b/ansible/roles/haproxy/tasks/config.yml index 6aa4c0bba8..d71ae7232b 100755 --- a/ansible/roles/haproxy/tasks/config.yml +++ b/ansible/roles/haproxy/tasks/config.yml @@ -12,3 +12,14 @@ - name: Allowing non-local IP binding sysctl: name="net.ipv4.ip_nonlocal_bind" value=1 sysctl_set=yes + +- name: Ensuring config directory exists + file: + path: "{{ node_config_directory }}/keepalived/" + state: "directory" + recurse: "yes" + +- name: Copying over config(s) + template: + src: "keepalived.conf.j2" + dest: "{{ node_config_directory }}/keepalived/keepalived.conf" diff --git a/ansible/roles/haproxy/tasks/start.yml b/ansible/roles/haproxy/tasks/start.yml index cbb577b0f2..cda6c0cf3c 100755 --- a/ansible/roles/haproxy/tasks/start.yml +++ b/ansible/roles/haproxy/tasks/start.yml @@ -1,4 +1,14 @@ --- +- include: ../../start.yml + vars: + container_image: "{{ docker_keepalived_image_full }}" + container_name: "keepalived" + container_privileged: "True" + container_volumes: + - "{{ node_config_directory }}/keepalived/:/opt/kolla/keepalived/:ro" + container_environment: + KOLLA_CONFIG_STRATEGY: "{{ config_strategy }}" + - include: ../../start.yml vars: container_image: "{{ docker_haproxy_image_full }}" diff --git a/ansible/roles/haproxy/templates/keepalived.conf.j2 b/ansible/roles/haproxy/templates/keepalived.conf.j2 new file mode 100644 index 0000000000..05062e5bdb --- /dev/null +++ b/ansible/roles/haproxy/templates/keepalived.conf.j2 @@ -0,0 +1,19 @@ +vrrp_script check_alive { + script "/check_alive.sh" + interval 2 + weight -10 +} + +vrrp_instance Floating { + state MASTER + interface {{ api_interface }} + virtual_router_id 51 + priority {{ groups['database'].index(inventory_hostname) }} + advert_int 1 + virtual_ipaddress { + {{ kolla_internal_address }} + } + track_script { + check_alive + } +} diff --git a/docker/centos/binary/keepalived/Dockerfile b/docker/centos/binary/keepalived/Dockerfile index f24954990d..6aa0a4f100 100755 --- a/docker/centos/binary/keepalived/Dockerfile +++ b/docker/centos/binary/keepalived/Dockerfile @@ -8,6 +8,7 @@ RUN yum -y install \ && yum clean all COPY keepalived.conf /etc/keepalived/ - COPY start.sh check_alive.sh / +COPY config-internal.sh config-external.sh /opt/kolla/ + CMD ["/start.sh"] diff --git a/docker/centos/binary/keepalived/config-external.sh b/docker/centos/binary/keepalived/config-external.sh new file mode 120000 index 0000000000..08cebbe79c --- /dev/null +++ b/docker/centos/binary/keepalived/config-external.sh @@ -0,0 +1 @@ +../../../common/keepalived/config-external.sh \ No newline at end of file diff --git a/docker/centos/binary/keepalived/config-internal.sh b/docker/centos/binary/keepalived/config-internal.sh new file mode 120000 index 0000000000..9e9437a008 --- /dev/null +++ b/docker/centos/binary/keepalived/config-internal.sh @@ -0,0 +1 @@ +../../../common/keepalived/config-internal.sh \ No newline at end of file diff --git a/docker/common/keepalived/config-external.sh b/docker/common/keepalived/config-external.sh new file mode 100755 index 0000000000..cb69e1c8f6 --- /dev/null +++ b/docker/common/keepalived/config-external.sh @@ -0,0 +1,11 @@ +#!/bin/bash +SOURCE="/opt/kolla/keepalived/keepalived.conf" +TARGET="/etc/keepalived/keepalived.conf" +OWNER="root" + +if [[ -f "$SOURCE" ]]; then + rm $TARGET + cp $SOURCE $TARGET + chown ${OWNER}: $TARGET + chmod 0644 $TARGET +fi diff --git a/docker/common/keepalived/config-internal.sh b/docker/common/keepalived/config-internal.sh new file mode 100755 index 0000000000..3d182f6355 --- /dev/null +++ b/docker/common/keepalived/config-internal.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +. /opt/kolla/kolla-common.sh + +check_required_vars KEEPALIVED_HOST_PRIORITIES \ + PUBLIC_INTERFACE \ + PUBLIC_IP + +MY_HOSTNAME=`hostname` + +# here we unpack KEEPALIVED_HOST_PRIORITIES hostname:priority pairs and match +# them with current hostname, if it's there +for i in ${KEEPALIVED_HOST_PRIORITIES//,/ }; do + HOST_PRIORITY=(${i//:/ }) + if [ "$MY_HOSTNAME" == "${HOST_PRIORITY[0]}" ]; then + KEEPALIVED_PRIORITY=${HOST_PRIORITY[1]} + fi +done + +if [ -z "$KEEPALIVED_PRIORITY" ]; then + echo "ERROR: missing hostname in KEEPALIVED_HOST_PRIORITIES: $MY_HOSTNAME" >&2 + exit 1 +fi + +sed -i ' + s|@PUBLIC_INTERFACE@|'$PUBLIC_INTERFACE'|g + s|@PUBLIC_IP@|'$PUBLIC_IP'|g + s|@KEEPALIVED_PRIORITY@|'$KEEPALIVED_PRIORITY'|g +' /etc/keepalived/keepalived.conf + +exec /usr/sbin/keepalived -nld -p /run/keepalived.pid diff --git a/docker/common/keepalived/start.sh b/docker/common/keepalived/start.sh index 3d182f6355..64f47e2952 100755 --- a/docker/common/keepalived/start.sh +++ b/docker/common/keepalived/start.sh @@ -1,31 +1,13 @@ #!/bin/bash +set -o errexit -. /opt/kolla/kolla-common.sh +CMD="/usr/sbin/keepalived" +ARGS="-nld -p /run/keepalived.pid" -check_required_vars KEEPALIVED_HOST_PRIORITIES \ - PUBLIC_INTERFACE \ - PUBLIC_IP +# Loading common functions. +source /opt/kolla/kolla-common.sh -MY_HOSTNAME=`hostname` +# Config-internal script exec out of this function, it does not return here. +set_configs -# here we unpack KEEPALIVED_HOST_PRIORITIES hostname:priority pairs and match -# them with current hostname, if it's there -for i in ${KEEPALIVED_HOST_PRIORITIES//,/ }; do - HOST_PRIORITY=(${i//:/ }) - if [ "$MY_HOSTNAME" == "${HOST_PRIORITY[0]}" ]; then - KEEPALIVED_PRIORITY=${HOST_PRIORITY[1]} - fi -done - -if [ -z "$KEEPALIVED_PRIORITY" ]; then - echo "ERROR: missing hostname in KEEPALIVED_HOST_PRIORITIES: $MY_HOSTNAME" >&2 - exit 1 -fi - -sed -i ' - s|@PUBLIC_INTERFACE@|'$PUBLIC_INTERFACE'|g - s|@PUBLIC_IP@|'$PUBLIC_IP'|g - s|@KEEPALIVED_PRIORITY@|'$KEEPALIVED_PRIORITY'|g -' /etc/keepalived/keepalived.conf - -exec /usr/sbin/keepalived -nld -p /run/keepalived.pid +exec $CMD $ARGS