Ansible is great as a configuration management tool. What I like most about it, is that you can make your own recipe on how to handle things.
Here we’ll talk about how can Ansible restart, sequentially, a service, on some servers, which are members of a load balancing poll.
Long story short, we have an F5 load balancer which distributes the syslog traffic to 2-3 servers. These servers run syslog-ng. We don’t want to restart syslog-ng at the same time on all the nodes. We’ll lose events.
The tricky part is how to call the handler in Ansible but not at the same time on all servers behind it.
I’ll use server1 and server2 as examples. Below the implementation:
- For each server, assign a variable (I’m calling it node_type) and a value, primary or secondary. We can expand this to more than 2 servers by making one primary and the rest secondaries.
#cat host_vars/server1 node_type: primary #cat host_vars/server2 node_type: secondary
- Create the handler components:
- name: restart_syslog-ng_primary systemd: name: syslog-ng.service state: restarted listen: restart_syslog-ng when: node_type == "primary" - name: restart_syslog-ng_secondary systemd: name: syslog-ng.service state: restarted listen: restart_syslog-ng when: node_type == "secondary"
- Use the handler inside a task:
- name: Install syslog-ng configuration copy: src: files/syslog-ng.conf dest: /etc/syslog-ng/syslog-ng.conf mode: 0644 owner: root group: root backup: yes notify: - restart_syslog-ng
The most important part above is the notify section, which calls the listener, restart_syslog-ng, which triggers two handlers sequentially.