Keepalived notification
diff --git a/README.rst b/README.rst
index 639d612..f078f2b 100644
--- a/README.rst
+++ b/README.rst
@@ -17,12 +17,14 @@
enabled: True
instance:
VIP1:
+ nopreempt: True
priority: 100 (highest priority must be on primary server, different for cluster members)
virtual_router_id: 51
password: pass
address: 192.168.10.1
interface: eth0
VIP2:
+ nopreempt: True
priority: 150 (highest priority must be on primary server, different for cluster members)
virtual_router_id: 52
password: pass
@@ -38,6 +40,56 @@
enabled: True
instance:
VIP1:
+ nopreempt: True
+ priority: 100 (highest priority must be on primary server, different for cluster members)
+ virtual_router_id: 51
+ password: pass
+ addresses:
+ - 192.168.10.1
+ - 192.168.10.2
+ interface: eth0
+
+Disable nopreempt mode to have Master. Highest priority is taken in all cases.
+
+.. code-block:: yaml
+
+ keepalived:
+ cluster:
+ enabled: True
+ instance:
+ VIP1:
+ nopreempt: False
+ priority: 100 (highest priority must be on primary server, different for cluster members)
+ virtual_router_id: 51
+ password: pass
+ addresses:
+ - 192.168.10.1
+ - 192.168.10.2
+ interface: eth0
+
+Notify action in keepalived.
+
+.. code-block:: yaml
+
+ keepalived:
+ cluster:
+ enabled: True
+ instance:
+ VIP1:
+ nopreempt: True
+ notify_action:
+ master: |
+ /usr/bin/docker start jenkins
+ /usr/bin/docker start gerrit
+ exit 0
+ backup: |
+ /usr/bin/docker stop jenkins
+ /usr/bin/docker stop gerrit
+ exit 0
+ fault: |
+ /usr/bin/docker stop jenkins
+ /usr/bin/docker stop gerrit
+ exit 0
priority: 100 (highest priority must be on primary server, different for cluster members)
virtual_router_id: 51
password: pass
diff --git a/keepalived/cluster.sls b/keepalived/cluster.sls
index 85b107f..1c6abbf 100644
--- a/keepalived/cluster.sls
+++ b/keepalived/cluster.sls
@@ -14,6 +14,25 @@
- require:
- pkg: keepalived_packages
+{% for instance_name, instance in cluster.instance.iteritems() %}
+
+{{%- if instance.notify_action is defined }}
+
+keepalived_{{ instance_name }}_notify:
+ file.managed:
+ - name: /usr/local/bin/keepalivednotify_{{ instance_name }}.sh
+ - mode: 744
+ - source: salt://keepalived/files/keepalivednotify.sh
+ - template: jinja
+ - require:
+ - pkg: keepalived_packages
+ - require_in:
+ - service: keepalived_service
+
+{%- endif %}
+
+{% endfor %}
+
keepalived_service:
service.running:
- name: {{ cluster.service }}
diff --git a/keepalived/files/keepalived.conf b/keepalived/files/keepalived.conf
index ed429be..af62535 100644
--- a/keepalived/files/keepalived.conf
+++ b/keepalived/files/keepalived.conf
@@ -4,11 +4,18 @@
{% for instance_name, instance in cluster.instance.iteritems() %}
vrrp_instance {{ instance_name }} {
+ {{%- if instance.get('nopreempt', True) }}
state BACKUP
nopreempt
garp_master_delay 5
garp_master_repeat 3
garp_master_refresh 1
+ {%- else %}
+ state MASTER
+ {%- endif %}
+ {{%- if instance.notify_action is defined }}
+ notify /usr/local/bin/keepalivednotify_{{ instance_name }}.sh
+ {%- endif %}
interface {{ instance.interface }}
virtual_router_id {{ instance.virtual_router_id }}
priority {{ instance.priority }}
diff --git a/keepalived/files/keepalivednotify.sh b/keepalived/files/keepalivednotify.sh
new file mode 100644
index 0000000..a4f1496
--- /dev/null
+++ b/keepalived/files/keepalivednotify.sh
@@ -0,0 +1,23 @@
+#!/bin/bash
+
+TYPE=$1
+NAME=$2
+STATE=$3
+
+case $STATE in
+ "MASTER") /usr/bin/docker start jenkins
+ /usr/bin/docker start artifactory
+ exit 0
+ ;;
+ "BACKUP") /usr/bin/docker stop jenkins
+ /usr/bin/docker stop artifactory
+ exit 0
+ ;;
+ "FAULT") /usr/bin/docker stop jenkins
+ /usr/bin/docker stop artifactory
+ exit 0
+ ;;
+ *) echo "unknown state"
+ exit 1
+ ;;
+esac
\ No newline at end of file