Keepalived Installation Using Ansible
Keepalived Installation Using Ansible
Component Description
Purpose Provides seamless failover using a floating Virtual IP (VIP)
Role in Cluster Ensures clients always connect to the active primary node
Failover Trigger Monitors node health via scripts (e.g., pg_isready, replication lag)
VIP Management Automatically assigns VIP to a standby when the primary fails
Works With Tools like repmgr, Patroni, or pg_auto_failover for node promotion
Client Impact No change in connection strings; failover is transparent
Failover Speed Near-instant switch of VIP to standby after detection
Health Check Custom scripts or PostgreSQL-native commands used to verify status
Use Case Production environments needing high availability without downtime
mkdir -p ~/keepalived-ansible/roles/keepalived/{tasks,templates,files}
mkdir -p ~/keepalived-ansible/inventory
cd ~/keepalived-ansible
vi ~/keepalived-ansible/inventory/hosts.ini
[keepalived_nodes]
pgm1 ansible_host=70.80.90.10 ansible_user=root priority=101 state=MASTER
pgm2 ansible_host=70.80.90.11 ansible_user=root priority=90 state=BACKUP
pgm3 ansible_host=70.80.90.12 ansible_user=root priority=80 state=BACKUP
mkdir -p /root/keepalived-ansible/keepalived-rpms
cd /root/keepalived-ansible/keepalived-rpms
--This will download keepalived and all dependencies into the current directory.
vi ~/keepalived-ansible/roles/keepalived/tasks/main.yml
file:
path: /etc/keepalived
state: directory
owner: root
group: root
mode: '0755'
file:
path: /tmp/keepalived-rpms/
state: directory
owner: root
group: root
mode: '0777'
copy:
dest: /tmp/keepalived-rpms/
mode: '0644'
find:
paths: /tmp/keepalived-rpms/
patterns: "*.rpm"
register: keepalived_rpm_files
dnf:
state: present
ansible.builtin.systemd:
daemon_reload: yes
sysctl:
sysctl_set: yes
state: present
reload: yes
loop:
template:
src: keepalived.conf.j2
dest: /etc/keepalived/keepalived.conf
owner: root
group: root
mode: 0644
register: keepalived_check
ignore_errors: yes
debug:
ansible.builtin.systemd:
daemon_reload: yes
systemd:
name: keepalived
enabled: yes
state: started
-------------------------------------------------------------------
mkdir -p ~/keepalived-ansible/roles/keepalived/defaults
vi ~/keepalived-ansible/roles/keepalived/defaults/main.yml
vip_address: "70.80.90.221"
interface_name: "ens224"
router_id: 51
vi ~/keepalived-ansible/roles/keepalived/templates/keepalived.conf.j2
vrrp_instance VI_1 {
state {{ state }}
interface {{ interface_name }}
virtual_router_id {{ router_id }}
priority {{ priority }}
advert_int 1
virtual_ipaddress {
{{ vip_address }}
}
Step 5: Create Main Playbook
vi ~/keepalived-ansible/playbook.yml
- name: Setup Keepalived on PostgreSQL nodes
hosts: keepalived_nodes
become: yes
roles:
- keepalived
---------------------------------------------------------------------------------------------