This playbook installs Apache Cassandra using distro-aware package handling and applies a minimal service baseline. For production environments, consider using version 5.0 for the latest features or 4.1 for proven stability.
- name: Install Apache Cassandra
hosts: cassandra
become: true
vars:
cassandra_version: "5.0.6" # Specify desired version
app_packages_debian:
- cassandra={{ cassandra_version }}
app_packages_redhat:
- cassandra-{{ cassandra_version }}
pre_tasks:
# Add Cassandra repository for Debian/Ubuntu
- name: Add Cassandra repository key (Debian)
apt_key:
url: https://debian.cassandra.apache.org/KEY.gpg
state: present
when: ansible_os_family == "Debian"
- name: Add Cassandra repository (Debian)
apt_repository:
repo: deb https://debian.cassandra.apache.org 41x main
state: present
filename: cassandra
when: ansible_os_family == "Debian"
# Add Cassandra repository for RHEL-family
- name: Add Cassandra repository (RHEL)
copy:
content: |
[cassandra]
name=Apache Cassandra
baseurl=https://redhat.cassandra.apache.org/41x/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://redhat.cassandra.apache.org/KEY.gpg
dest: /etc/yum.repos.d/cassandra.repo
when: ansible_os_family == "RedHat"
tasks:
- name: Update apt cache (Debian)
apt:
update_cache: true
when: ansible_os_family == "Debian"
- name: Install packages on Debian family
apt:
name: "{{ app_packages_debian }}"
state: present
allow_downgrade: false
when: ansible_os_family == "Debian"
- name: Install packages on RedHat family
dnf:
name: "{{ app_packages_redhat }}"
state: present
when: ansible_os_family == "RedHat"
- name: Enable and start service
service:
name: cassandra
state: started
enabled: true
- name: Wait for Cassandra to be ready
wait_for:
port: 9042
delay: 30
timeout: 300
- name: Validate binary availability
command: nodetool version
register: app_version
changed_when: false
failed_when: false
- name: Show version/check output
debug:
var: app_version.stdout
- name: Check cluster status
command: nodetool status
register: cluster_status
changed_when: false
failed_when: false
- name: Show cluster status
debug:
var: cluster_status.stdout
For production deployments, consider creating a dedicated role with additional configuration:
- name: Deploy Cassandra with custom configuration
hosts: cassandra
become: true
roles:
- cassandra
vars:
cassandra_cluster_name: "production-cluster"
cassandra_seeds: "{{ groups['cassandra'] | map('extract', hostvars, ['ansible_default_ipv4', 'address']) | join(',') }}"
cassandra_listen_address: "{{ ansible_default_ipv4.address }}"
cassandra_rpc_address: "{{ ansible_default_ipv4.address }}"
cassandra_version: "5.0.6"
Consider using the community.cassandra collection for advanced operations:
# requirements.yml
collections:
- name: community.cassandra
version: ">=1.0.0"
Then use specialized modules for managing roles, keyspaces, and tables:
- name: Create Cassandra role
community.cassandra.cassandra_role:
name: app_user
password: "{{ vault_app_user_password }}"
login_host: "{{ inventory_hostname }}"
state: present
nodetool status.