This playbook deploys Redis in a Docker container using Ansible to manage the entire lifecycle including Docker installation, volume setup, and container orchestration.
---
- name: Deploy Redis with Docker
hosts: redis_docker
become: true
vars:
redis_version: "8.6"
redis_base_dir: /opt/redis
redis_data_dir: "{{ redis_base_dir }}/data"
redis_config_dir: "{{ redis_base_dir }}/config"
redis_container_name: redis-primary
redis_host_port: 6379
redis_bind_address: "127.0.0.1"
redis_password: "{{ vault_redis_password | default('change_me') }}"
redis_maxmemory: "512mb"
redis_maxmemory_policy: "allkeys-lru"
tasks:
- name: Create base directories
file:
path: "{{ item }}"
state: directory
mode: '0755'
loop:
- "{{ redis_base_dir }}"
- "{{ redis_data_dir }}"
- "{{ redis_config_dir }}"
- name: Install Docker packages
package:
name:
- docker-ce
- docker-ce-cli
- containerd.io
- docker-compose-plugin
state: present
notify: restart docker
- name: Enable and start Docker service
systemd:
name: docker
state: started
enabled: true
- name: Create Redis configuration
copy:
dest: "{{ redis_config_dir }}/redis.conf"
content: |
bind 0.0.0.0
port 6379
protected-mode yes
requirepass {{ redis_password }}
maxmemory {{ redis_maxmemory }}
maxmemory-policy {{ redis_maxmemory_policy }}
appendonly yes
appendfsync everysec
mode: '0644'
notify: restart redis container
- name: Create Docker Compose file
copy:
dest: "{{ redis_base_dir }}/compose.yaml"
content: |
services:
redis:
image: redis:{{ redis_version }}
container_name: {{ redis_container_name }}
restart: unless-stopped
ports:
- "{{ redis_bind_address }}:{{ redis_host_port }}:6379"
volumes:
- ./data:/data
- ./config/redis.conf:/usr/local/etc/redis/redis.conf
command: redis-server /usr/local/etc/redis/redis.conf
networks:
- redis-net
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 30s
timeout: 10s
retries: 3
start_period: 30s
networks:
redis-net:
driver: bridge
mode: '0644'
notify: restart redis container
- name: Start Redis container
community.docker.docker_compose_v2:
project_src: "{{ redis_base_dir }}"
state: present
build: never
- name: Wait for Redis to become available
wait_for:
host: "{{ redis_bind_address }}"
port: "{{ redis_host_port }}"
delay: 2
timeout: 30
delegate_to: localhost
- name: Display Redis status
debug:
msg: "Redis container is running"
handlers:
- name: restart docker
systemd:
name: docker
state: restarted
- name: restart redis container
community.docker.docker_compose_v2:
project_src: "{{ redis_base_dir }}"
state: present
build: never
listen: restart redis container
ansible-vault create group_vars/redis_docker/vault.yml
ansible-playbook -i inventory.yml redis-docker.yml --ask-vault-pass