This playbook deploys MariaDB in a Docker container using Ansible to manage the entire lifecycle including Docker installation, volume setup, and container orchestration.
---
- name: Deploy MariaDB with Docker
hosts: mariadb_docker
become: true
vars:
mariadb_version: "11.4"
mariadb_base_dir: /opt/mariadb
mariadb_data_dir: "{{ mariadb_base_dir }}/data"
mariadb_config_dir: "{{ mariadb_base_dir }}/config"
mariadb_container_name: mariadb-primary
mariadb_host_port: 3306
mariadb_bind_address: "127.0.0.1"
mariadb_root_password: "{{ vault_mariadb_root_password | default('change_me_root') }}"
mariadb_database: appdb
mariadb_user: appuser
mariadb_password: "{{ vault_mariadb_app_password | default('change_me_app') }}"
tasks:
- name: Create base directories
file:
path: "{{ item }}"
state: directory
mode: '0755'
loop:
- "{{ mariadb_base_dir }}"
- "{{ mariadb_data_dir }}"
- "{{ mariadb_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: "{{ mariadb_base_dir }}/.env"
content: |
MARIADB_ROOT_PASSWORD={{ mariadb_root_password }}
MARIADB_DATABASE={{ mariadb_database }}
MARIADB_USER={{ mariadb_user }}
MARIADB_PASSWORD={{ mariadb_password }}
mode: '0600'
no_log: true
- name: Create Docker Compose file
copy:
dest: "{{ mariadb_base_dir }}/compose.yaml"
content: |
services:
mariadb:
image: mariadb:{{ mariadb_version }}
container_name: {{ mariadb_container_name }}
restart: unless-stopped
ports:
- "{{ mariadb_bind_address }}:{{ mariadb_host_port }}:3306"
environment:
- MARIADB_ROOT_PASSWORD=${MARIADB_ROOT_PASSWORD}
- MARIADB_DATABASE=${MARIADB_DATABASE}
- MARIADB_USER=${MARIADB_USER}
- MARIADB_PASSWORD=${MARIADB_PASSWORD}
volumes:
- ./data:/var/lib/mysql
- ./config:/etc/mysql/conf.d
healthcheck:
test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
interval: 10s
timeout: 5s
retries: 3
start_period: 60s
networks:
mariadb-network:
driver: bridge
mode: '0644'
notify: restart mariadb container
- name: Start MariaDB container
community.docker.docker_compose_v2:
project_src: "{{ mariadb_base_dir }}"
state: present
build: never
- name: Wait for MariaDB to become available
wait_for:
host: "{{ mariadb_bind_address }}"
port: "{{ mariadb_host_port }}"
delay: 5
timeout: 60
delegate_to: localhost
- name: Display MariaDB status
debug:
msg: "MariaDB container is running"
handlers:
- name: restart docker
systemd:
name: docker
state: restarted
- name: restart mariadb container
community.docker.docker_compose_v2:
project_src: "{{ mariadb_base_dir }}"
state: present
build: never
listen: restart mariadb container
ansible-vault create group_vars/mariadb_docker/vault.yml
ansible-playbook -i inventory.yml mariadb-docker.yml --ask-vault-pass