--- - name: Add needed groups group: name: "{{ item.user }}" with_items: - "{{ redis_configs | default([]) }}" - name: Add cluster users user: name: "{{ item.user }}" shell: /bin/false state: present createhome: no system: yes group: "{{ item.user }}" with_items: - "{{ redis_configs | default([]) }}" - name: Install redis-server and dependencies apt: name: "{{ item }}" update_cache: yes cache_valid_time: 3600 default_release: jessie-backports with_items: - "redis-server" - "ruby-redis" - name: Add redis-trib script patched with redis auth support template: src: "redis-trib.rb.j2" dest: "/usr/local/bin/redis-trib.rb" owner: root group: root mode: "0755" - name: Ensure default redis daemon is stopped and masked systemd: name: "redis-server" state: "stopped" masked: yes - name: Ensure redis data dirs exist file: path: "{{ redis_dir }}/{{ item.name }}" state: directory owner: "{{ item.user }}" group: "{{ item.user }}" mode: "0750" with_items: - "{{ redis_configs | default([]) }}" - name: Set redis base logdir permissions file: path: "/var/log/redis" owner: redis group: redis mode: "0755" state: directory - name: Create redis logdirs for all redis instances file: path: "/var/log/redis/{{ item.name }}" owner: "{{ item.user }}" group: "{{ item.user }}" mode: "0750" state: directory with_items: - "{{ redis_configs | default([]) }}" - name: Set redis data dir permissions file: path: "/var/lib/redis" owner: redis group: redis mode: "0751" state: directory - name: Template redis config template: src: "redis.conf.j2" dest: "/etc/redis/{{ item.name }}.conf" owner: root group: "{{ item.user }}" mode: "0640" register: redis_config_template with_items: - "{{ redis_configs | default([]) }}" - name: Template redis unit files template: src: "redis-server.service.j2" dest: "/lib/systemd/system/redis_{{ item.name }}.service" owner: root group: root mode: "0644" register: redis_unit_file_template with_items: - "{{ redis_configs | default([]) }}" - name: Enable redis unit files systemd: name: "redis_{{ item.name }}.service" enabled: yes daemon_reload: yes register: redis_unit_file_enable with_items: - "{{ redis_configs | default([]) }}" - name: Determine Redis instances that require a restart set_fact: redis_restart_instances: "{{ redis_restart_instances | default([]) + [item.item.name] }}" with_items: - "{{ redis_config_template.results }}" - "{{ redis_unit_file_template.results }}" - "{{ redis_unit_file_enable.results }}" when: item|changed and not item.item.name in redis_restart_instances|default([]) # We don't use a handler here because we need use a cluster and redis running in cluster mode before we continue # If we use a handler instead it'll restart at the end, which is too late for the cluster commands. - name: Restart Redis service: name: "redis_{{ item }}.service" state: restarted enabled: yes with_items: - "{{ redis_restart_instances | default([]) }}" - name: Check if Redis cluster has been initialized command: "/usr/bin/redis-cli -p {{ item.port }} CLUSTER INFO" run_once: yes register: redis_cluster_nodes_status changed_when: False with_items: - "{{ redis_configs | default([]) }}" - name: Create Redis cluster shell: "echo yes | /usr/local/bin/redis-trib.rb create --replicas 1 {{ redis_servers | join(':' + item.item.port + ' ') }}:{{ item.item.port }} {{ redis_servers | join(':' + item.item.slave_port + ' ') }}:{{ item.item.slave_port }}" run_once: yes with_items: - "{{ redis_cluster_nodes_status.results }}" when: - redis_cluster_nodes_status is defined - redis_cluster_nodes_status.results is defined - item.item is defined - item.item.port is defined - item.item.type is defined - item.item.type == 'master' - item.stdout is defined - item.stdout.find('cluster_size:0') != -1