This playbook deploys Apache Cassandra in Docker containers using Ansible to manage the entire lifecycle including Docker installation, volume setup, and container orchestration.
---
- name: Deploy Cassandra with Docker
hosts: cassandra_docker
become: true
vars:
cassandra_version: "5.0.6"
cassandra_base_dir: /opt/cassandra
cassandra_data_dir: "{{ cassandra_base_dir }}/data"
cassandra_container_name: cassandra-node1
cassandra_cql_port: 9042
cassandra_bind_address: "127.0.0.1"
cassandra_cluster_name: dev-cluster
cassandra_heap_size: "2G"
tasks:
- name: Create base directories
file:
path: "{{ item }}"
state: directory
mode: '0755'
loop:
- "{{ cassandra_base_dir }}"
- "{{ cassandra_data_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 Docker Compose file
copy:
dest: "{{ cassandra_base_dir }}/compose.yaml"
content: |
services:
cassandra:
image: cassandra:{{ cassandra_version }}
container_name: {{ cassandra_container_name }}
restart: unless-stopped
environment:
- CASSANDRA_CLUSTER_NAME={{ cassandra_cluster_name }}
- CASSANDRA_SEEDS={{ cassandra_container_name }}
- CASSANDRA_ENDPOINT_SNITCH=GossipingPropertyFileSnitch
- MAX_HEAP_SIZE={{ cassandra_heap_size }}
ports:
- "{{ cassandra_bind_address }}:{{ cassandra_cql_port }}:9042"
volumes:
- ./data:/var/lib/cassandra
ulimits:
memlock: -1
nproc: 32768
nofile: 100000
healthcheck:
test: ["CMD", "cqlsh", "-e", "DESCRIBE KEYSPACES"]
interval: 30s
timeout: 10s
retries: 5
start_period: 90s
networks:
cassandra-net:
driver: bridge
mode: '0644'
notify: restart cassandra container
- name: Start Cassandra container
community.docker.docker_compose_v2:
project_src: "{{ cassandra_base_dir }}"
state: present
build: never
- name: Wait for Cassandra to become available
wait_for:
host: "{{ cassandra_bind_address }}"
port: "{{ cassandra_cql_port }}"
delay: 10
timeout: 120
delegate_to: localhost
- name: Display Cassandra status
debug:
msg: "Cassandra container is running"
handlers:
- name: restart docker
systemd:
name: docker
state: restarted
- name: restart cassandra container
community.docker.docker_compose_v2:
project_src: "{{ cassandra_base_dir }}"
state: present
build: never
listen: restart cassandra container
ansible-playbook -i inventory.yml cassandra-docker.yml