This playbook deploys CouchDB in a Docker container using Ansible to manage the entire lifecycle including Docker installation, volume setup, and container orchestration.
---
- name: Deploy CouchDB with Docker
hosts: couchdb_docker
become: true
vars:
couchdb_version: "3.5.1"
couchdb_base_dir: /opt/couchdb
couchdb_data_dir: "{{ couchdb_base_dir }}/data"
couchdb_config_dir: "{{ couchdb_base_dir }}/config"
couchdb_container_name: couchdb-primary
couchdb_host_port: 5984
couchdb_bind_address: "127.0.0.1"
couchdb_admin_user: admin
couchdb_admin_password: "{{ vault_couchdb_admin_password | default('change_me') }}"
tasks:
- name: Create base directories
file:
path: "{{ item }}"
state: directory
mode: '0755'
loop:
- "{{ couchdb_base_dir }}"
- "{{ couchdb_data_dir }}"
- "{{ couchdb_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 environment file
copy:
dest: "{{ couchdb_base_dir }}/.env"
content: |
COUCHDB_USER={{ couchdb_admin_user }}
COUCHDB_PASSWORD={{ couchdb_admin_password }}
mode: '0600'
no_log: true
- name: Create Docker Compose file
copy:
dest: "{{ couchdb_base_dir }}/compose.yaml"
content: |
services:
couchdb:
image: couchdb:{{ couchdb_version }}
container_name: {{ couchdb_container_name }}
restart: unless-stopped
ports:
- "{{ couchdb_bind_address }}:{{ couchdb_host_port }}:5984"
environment:
- COUCHDB_USER=${COUCHDB_USER}
- COUCHDB_PASSWORD=${COUCHDB_PASSWORD}
volumes:
- ./data:/opt/couchdb/data
- ./config:/opt/couchdb/etc/local.d
networks:
- couchdb-net
healthcheck:
test: ["CMD", "curl", "-f", "http://admin:password@localhost:5984/"]
interval: 30s
timeout: 10s
retries: 3
start_period: 60s
networks:
couchdb-net:
driver: bridge
mode: '0644'
notify: restart couchdb container
- name: Start CouchDB container
community.docker.docker_compose_v2:
project_src: "{{ couchdb_base_dir }}"
state: present
build: never
- name: Wait for CouchDB to become available
wait_for:
host: "{{ couchdb_bind_address }}"
port: "{{ couchdb_host_port }}"
delay: 5
timeout: 90
delegate_to: localhost
- name: Display CouchDB status
debug:
msg: "CouchDB container is running"
handlers:
- name: restart docker
systemd:
name: docker
state: restarted
- name: restart couchdb container
community.docker.docker_compose_v2:
project_src: "{{ couchdb_base_dir }}"
state: present
build: never
listen: restart couchdb container
ansible-vault create group_vars/couchdb_docker/vault.yml
ansible-playbook -i inventory.yml couchdb-docker.yml --ask-vault-pass