This playbook deploys MongoDB in a Docker container using Ansible to manage the entire lifecycle including Docker installation, volume setup, and container orchestration.
---
- name: Deploy MongoDB with Docker
hosts: mongodb_docker
become: true
vars:
mongodb_version: "8.0"
mongodb_base_dir: /opt/mongodb
mongodb_data_dir: "{{ mongodb_base_dir }}/data"
mongodb_config_dir: "{{ mongodb_base_dir }}/config"
mongodb_container_name: mongodb-prod
mongodb_host_port: 27017
mongodb_bind_address: "127.0.0.1"
mongodb_root_user: admin
mongodb_root_password: "{{ vault_mongodb_root_password | default('change_me_root') }}"
mongodb_database: main
mongodb_user: appuser
mongodb_password: "{{ vault_mongodb_app_password | default('change_me_app') }}"
tasks:
- name: Create base directories
file:
path: "{{ item }}"
state: directory
mode: '0755'
loop:
- "{{ mongodb_base_dir }}"
- "{{ mongodb_data_dir }}"
- "{{ mongodb_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 MongoDB configuration
copy:
dest: "{{ mongodb_config_dir }}/mongod.conf"
content: |
storage:
dbPath: /data/db
journal:
enabled: true
net:
port: 27017
bindIp: 0.0.0.0
security:
authorization: enabled
mode: '0644'
notify: restart mongodb container
- name: Create environment file
copy:
dest: "{{ mongodb_base_dir }}/.env"
content: |
MONGO_INITDB_ROOT_USERNAME={{ mongodb_root_user }}
MONGO_INITDB_ROOT_PASSWORD={{ mongodb_root_password }}
MONGO_INITDB_DATABASE={{ mongodb_database }}
mode: '0600'
no_log: true
- name: Create Docker Compose file
copy:
dest: "{{ mongodb_base_dir }}/compose.yaml"
content: |
services:
mongodb:
image: mongo:{{ mongodb_version }}
container_name: {{ mongodb_container_name }}
restart: unless-stopped
ports:
- "{{ mongodb_bind_address }}:{{ mongodb_host_port }}:27017"
environment:
- MONGO_INITDB_ROOT_USERNAME=${MONGO_INITDB_ROOT_USERNAME}
- MONGO_INITDB_ROOT_PASSWORD=${MONGO_INITDB_ROOT_PASSWORD}
- MONGO_INITDB_DATABASE=${MONGO_INITDB_DATABASE}
volumes:
- ./data:/data/db
- ./config:/etc/mongo/mongod.conf
networks:
- mongodb-net
healthcheck:
test: ["CMD", "mongosh", "--eval", "db.adminCommand('ping')"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
networks:
mongodb-net:
driver: bridge
mode: '0644'
notify: restart mongodb container
- name: Start MongoDB container
community.docker.docker_compose_v2:
project_src: "{{ mongodb_base_dir }}"
state: present
build: never
- name: Wait for MongoDB to become available
wait_for:
host: "{{ mongodb_bind_address }}"
port: "{{ mongodb_host_port }}"
delay: 5
timeout: 60
delegate_to: localhost
- name: Display MongoDB status
debug:
msg: "MongoDB container is running"
handlers:
- name: restart docker
systemd:
name: docker
state: restarted
- name: restart mongodb container
community.docker.docker_compose_v2:
project_src: "{{ mongodb_base_dir }}"
state: present
build: never
listen: restart mongodb container
ansible-vault create group_vars/mongodb_docker/vault.yml
ansible-playbook -i inventory.yml mongodb-docker.yml --ask-vault-pass