Skip to content

Commit 0c5d7ff

Browse files
committed
Add redis role with sample inventory
This commit adds the redis role complete of a full inventory usable inside the sample lab.
1 parent 901d057 commit 0c5d7ff

14 files changed

+452
-0
lines changed

inventory/lab/group_vars/redis.yaml

+53
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
---
2+
3+
redis_instances:
4+
- name: 'master'
5+
state: 'started'
6+
enabled: true
7+
user: 'redis'
8+
group: 'redis'
9+
config_path: '/etc'
10+
config_file: 'redis_master.conf'
11+
bind: '0.0.0.0'
12+
port: '6379'
13+
loglevel: 'warning'
14+
logfile: '/var/log/redis/redis_master.log'
15+
tcp_keepalive: '300'
16+
tcp_backlog: '65536'
17+
pidfile: '/var/run/redis_master_6379.pid'
18+
working_dir: '/var/lib/redis_master'
19+
maxmemory_policy: 'noeviction'
20+
cluster_enabled: 'yes'
21+
exporter_enabled: false
22+
- name: 'slave'
23+
state: 'started'
24+
enabled: true
25+
user: 'redis'
26+
group: 'redis'
27+
config_path: '/etc'
28+
config_file: 'redis_slave.conf'
29+
bind: '0.0.0.0'
30+
port: '6380'
31+
loglevel: 'warning'
32+
logfile: '/var/log/redis/redis_slave.log'
33+
tcp_keepalive: '300'
34+
tcp_backlog: '65536'
35+
pidfile: '/var/run/redis_slave_6380.pid'
36+
working_dir: '/var/lib/redis_slave'
37+
maxmemory_policy: 'noeviction'
38+
cluster_enabled: 'yes'
39+
exporter_enabled: false
40+
41+
# Note: Redis do not support hostnames, use IPs
42+
redis_clusters:
43+
- name: redis_cluster
44+
nodes:
45+
- master: 192.168.122.50:6379
46+
slaves:
47+
- 192.168.122.51:6380
48+
- master: 192.168.122.51:6379
49+
slaves:
50+
- 192.168.122.52:6380
51+
- master: 192.168.122.52:6379
52+
slaves:
53+
- 192.168.122.50:6380

inventory/lab/hosts

+5
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,8 @@ graylog-3
2121
kubernetes-1 k8s_role=master run_non_infra_pods=true
2222
kubernetes-2 k8s_role=worker
2323
kubernetes-3 k8s_role=worker
24+
25+
[redis]
26+
redis-1
27+
redis-2
28+
redis-3

redis.yml

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
- hosts: redis
3+
become: true
4+
tasks:
5+
- import_role:
6+
name: redis

roles/redis/defaults/main.yaml

+45
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
---
2+
3+
redis_server_bin: '/bin/redis-server'
4+
redis_cli_bin: '/bin/redis-cli'
5+
6+
redis_exporter_enable: true
7+
redis_exporter_bin: '/bin/redis_exporter'
8+
redis_exporter_version: 'v1.9.0'
9+
redis_exporter_arch: 'linux-amd64'
10+
redis_exporter_download_url: "https://github.com/oliver006/redis_exporter/releases/download/{{ redis_exporter_version }}/redis_exporter-{{ redis_exporter_version }}.{{ redis_exporter_arch }}.tar.gz"
11+
12+
redis_instances:
13+
- name: 'default'
14+
state: 'started'
15+
enabled: true
16+
user: 'redis'
17+
group: 'redis'
18+
config_path: '/etc'
19+
config_file: 'redis.conf'
20+
bind: '0.0.0.0'
21+
port: '6379'
22+
loglevel: 'warning'
23+
logfile: '/var/log/redis/redis.log'
24+
tcp_keepalive: '300'
25+
tcp_backlog: '65536'
26+
pidfile: '/var/run/redis_6379.pid'
27+
working_dir: '/var/lib/redis'
28+
maxmemory_policy: 'noeviction'
29+
cluster_enabled: 'no'
30+
exporter_enabled: false
31+
32+
redis_RedHat_package: 'redis'
33+
redis_RedHat_remi_package: 'http://rpms.remirepo.net/enterprise/remi-release-7.rpm'
34+
redis_Debian_package: 'redis-server'
35+
36+
system_sysctls:
37+
vm.overcommit_memory: 1
38+
vm.swappiness: 0
39+
40+
system_systemd_onetime_services:
41+
- name: 'disable-thp'
42+
description: 'Disable Transparent Huge Pages (THP)'
43+
command: "/bin/sh -c \"echo 'never' > /sys/kernel/mm/transparent_hugepage/enabled && echo 'never' > /sys/kernel/mm/transparent_hugepage/defrag\""
44+
before_services:
45+
- "redis_default"

roles/redis/handlers/main.yaml

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
---
2+
3+
- name: restart redis instance
4+
systemd:
5+
name: redis_{{ redis_instance_restart }}.service
6+
state: restarted
7+
8+
- name: restart redis exporter instance
9+
systemd:
10+
name: redis_{{ redis_exporter_instance_restart }}.service
11+
state: restarted

roles/redis/meta/main.yml

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
3+
dependencies:
4+
- common_handlers
5+
- system

roles/redis/tasks/main.yml

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
---
2+
3+
- include: redis_packages.yml
4+
5+
- name: Deploy Redis instances configurations
6+
include: redis_configs.yml
7+
with_items:
8+
- "{{ redis_instances }}"
9+
loop_control:
10+
loop_var: redis_instance
11+
12+
- name: Ensure Redis instances are started and enabled
13+
include: redis_services.yml
14+
with_items:
15+
- "{{ redis_instances }}"
16+
loop_control:
17+
loop_var: redis_instance
18+
19+
- name: Check and configure clusters
20+
include: redis_clusters.yml
21+
with_items:
22+
- "{{ redis_clusters }}"
23+
loop_control:
24+
loop_var: redis_cluster

roles/redis/tasks/redis_clusters.yml

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
---
2+
3+
- block:
4+
- name: "Get Redis cluster status"
5+
command: "redis-cli --cluster check {{ redis_cluster.nodes[0].master }}"
6+
failed_when: false
7+
changed_when: false
8+
register: redis_cluster_status
9+
10+
- block:
11+
- name: "Create Redis cluster, if needed"
12+
shell: |
13+
echo yes |
14+
redis-cli --cluster create \
15+
{% for node in redis_cluster.nodes %}{{ node.master }}{% if not loop.last %} {% endif %}{% endfor %}
16+
17+
- name: "Add Redis slave nodes"
18+
shell: |
19+
MASTER_ID=$(redis-cli cluster nodes | grep {{ item.master }} | cut -f 1 -d " ")
20+
{% for slave in item.slaves %}
21+
echo yes | redis-cli --cluster add-node {{ slave }} {{ item.master }} --cluster-slave --cluster-master-id $MASTER_ID
22+
{% endfor %}
23+
with_items:
24+
- "{{ redis_cluster.nodes }}"
25+
when:
26+
- redis_cluster_status.rc != 0
27+
run_once: true

roles/redis/tasks/redis_configs.yml

+72
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
---
2+
3+
- name: "Check if firewalld is active"
4+
systemd:
5+
name: firewalld
6+
register: firewalld_status
7+
changed_when: false
8+
failed_when: false
9+
10+
- name: "Enable Redis instance {{ redis_instance.name }} port "
11+
firewalld:
12+
port: "{{ redis_instance.port }}/tcp"
13+
state: enabled
14+
permanent: yes
15+
immediate: yes
16+
when:
17+
- firewalld_status.status.ActiveState == 'active'
18+
19+
- name: "Create Redis config path for instance {{ redis_instance.name }}"
20+
file:
21+
path: "{{ redis_instance.config_path }}"
22+
state: directory
23+
owner: 'root'
24+
group: 'root'
25+
26+
- name: "Create Redis working directory for instance {{ redis_instance.name }}"
27+
file:
28+
path: "{{ redis_instance.working_dir }}"
29+
state: directory
30+
owner: "{{ redis_instance.user }}"
31+
group: "{{ redis_instance.group }}"
32+
33+
- name: Set instance to restart fact, if needed
34+
set_fact:
35+
redis_instance_restart: "{{ redis_instance.name }}"
36+
37+
- name: "Deploy Redis configuration for instance {{ redis_instance.name }}"
38+
template:
39+
src: redis.conf.j2
40+
dest: "{{ redis_instance.config_path }}/{{ redis_instance.config_file }}"
41+
owner: 'root'
42+
group: 'root'
43+
mode: 0644
44+
notify:
45+
- restart redis instance
46+
47+
- name: "Deploy Redis systemd unit file for instance {{ redis_instance.name }}"
48+
template:
49+
src: redis.service.j2
50+
dest: "/etc/systemd/system/redis_{{ redis_instance.name }}.service"
51+
owner: 'root'
52+
group: 'root'
53+
mode: 0644
54+
notify:
55+
- reload systemd configuration
56+
- restart redis instance
57+
58+
- name: Set exporter instance to restart fact, if needed
59+
set_fact:
60+
redis_exporter_instance_restart: "{{ redis_instance.name }}"
61+
62+
- name: "Deploy Redis exporter systemd file for instance {{ redis_instance.name }}"
63+
template:
64+
src: redis_exporter.service.j2
65+
dest: "/etc/systemd/system/redis_{{ redis_instance.name }}_exporter.service"
66+
owner: 'root'
67+
group: 'root'
68+
mode: 0644
69+
notify:
70+
- reload systemd configuration
71+
when:
72+
- redis_instance.exporter_enabled | bool

roles/redis/tasks/redis_packages.yml

+73
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
---
2+
3+
- block:
4+
- name: Adding EPEL yum repository
5+
package:
6+
name:
7+
- epel-release
8+
- yum-utils
9+
- "{{ redis_RedHat_remi_package }}"
10+
11+
- name: Check if remi repository is enabled
12+
shell: |
13+
set -o pipefail
14+
yum clean expire-cache
15+
yum repolist enabled | grep ^remi
16+
register: remi_repository_is_enabled
17+
changed_when: false
18+
failed_when: false
19+
20+
- name: Enable remi repository
21+
command: 'yum-config-manager --enable remi'
22+
when:
23+
- remi_repository_is_enabled.rc != 0
24+
when:
25+
- ansible_os_family == "RedHat"
26+
27+
- name: Ensure Redis is installed
28+
package:
29+
name:
30+
- "{{ lookup('vars', 'redis_' + ansible_os_family + '_package') }}"
31+
state: "present"
32+
33+
- block:
34+
- name: "Check for {{ redis_exporter_bin }} existence under /usr/local/bin/redis_exporter-{{ redis_exporter_version }}.{{ redis_exporter_arch }}"
35+
stat:
36+
path: "/usr/local/bin/redis_exporter-{{ redis_exporter_version }}.{{ redis_exporter_arch }}/redis_exporter"
37+
register: redis_exporter_bin_stat
38+
39+
- name: "Check for {{ redis_exporter_bin }} link existence"
40+
stat:
41+
path: "{{ redis_exporter_bin }}"
42+
register: redis_exporter_link_stat
43+
44+
- block:
45+
- name: Download redis_exporter package
46+
get_url:
47+
url: "{{ redis_exporter_download_url }}"
48+
dest: "/tmp/redis_exporter-{{ redis_exporter_version }}.{{ redis_exporter_arch }}.tar.gz"
49+
50+
- name: Unarchive redis_exporter binary from downloaded package
51+
unarchive:
52+
src: "/tmp/redis_exporter-{{ redis_exporter_version }}.{{ redis_exporter_arch }}.tar.gz"
53+
dest: "/usr/local/bin"
54+
remote_src: yes
55+
56+
- name: Remove redise_exporter downloaded archive
57+
file:
58+
path: "/tmp/redis_exporter-{{ redis_exporter_version }}.{{ redis_exporter_arch }}.tar.gz"
59+
state: absent
60+
61+
- name: "Create redis_exporter executable into {{ redis_exporter_bin }}"
62+
file:
63+
src: "/usr/local/bin/redis_exporter-{{ redis_exporter_version }}.{{ redis_exporter_arch }}/redis_exporter"
64+
dest: "{{ redis_exporter_bin }}"
65+
force: yes
66+
state: link
67+
when:
68+
- redis_exporter_bin_stat.stat.executable is not defined or
69+
not redis_exporter_bin_stat.stat.executable | bool or
70+
redis_exporter_link_stat.stat.islnk is not defined or
71+
not redis_exporter_link_stat.stat.islnk | bool
72+
when:
73+
redis_exporter_enable | bool

roles/redis/tasks/redis_services.yml

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
---
2+
3+
- name: "Check Redis service - {{ redis_instance.name }} instance"
4+
service:
5+
name: "redis_{{ redis_instance.name }}"
6+
state: "{{ redis_instance.state }}"
7+
enabled: "{{ redis_instance.enabled }}"
8+
9+
- name: "Check Redis exporter service - {{ redis_instance.name }} instance"
10+
service:
11+
name: "redis_{{ redis_instance.name }}_exporter.service"
12+
state: "{{ redis_instance.exporter_state }}"
13+
enabled: "{{ redis_instance.exporter_enabled }}"
14+
when:
15+
- redis_instance.exporter_enabled | bool
16+
17+
- name: "Check if Redis {{ redis_instance.bind }}:{{ redis_instance.port }} instance {{ redis_instance.name }} is reachable"
18+
wait_for:
19+
host: "{{ redis_instance.bind }}"
20+
port: "{{ redis_instance.port }}"
21+
state: started

0 commit comments

Comments
 (0)