This playbook deploys Apache CloudStack in Docker using Ansible. Note: CloudStack is typically deployed on bare metal or VMs, but containerized setup is useful for testing and development.
---
- name: Deploy Apache CloudStack in Docker
hosts: cloudstack_docker
become: true
vars:
cloudstack_workspace: /opt/cloudstack
cloudstack_version: "4.22.0.0"
tasks:
- name: Ensure Docker is installed
package:
name: docker.io
state: present
- name: Enable and start Docker service
systemd:
name: docker
state: started
enabled: true
- name: Create CloudStack workspace directory
file:
path: "{{ cloudstack_workspace }}"
state: directory
mode: '0755'
- name: Create Docker Compose file for CloudStack
copy:
dest: "{{ cloudstack_workspace }}/docker-compose.yml"
content: |
version: '3.8'
services:
cloudstack-management:
image: apache/cloudstack:{{ cloudstack_version }}
container_name: cloudstack-mgmt
ports:
- "8080:8080"
environment:
- MYSQL_ROOT_PASSWORD={{ mysql_root_password }}
- MYSQL_DATABASE=cloud
- MYSQL_USER=cloud
- MYSQL_PASSWORD={{ cloud_mysql_password }}
volumes:
- ./data:/var/lib/cloudstack
networks:
- cloudstack-network
restart: unless-stopped
cloudstack-mysql:
image: mariadb:10.11
container_name: cloudstack-db
environment:
- MYSQL_ROOT_PASSWORD={{ mysql_root_password }}
- MYSQL_DATABASE=cloud
- MYSQL_USER=cloud
- MYSQL_PASSWORD={{ cloud_mysql_password }}
volumes:
- mysql-data:/var/lib/mysql
networks:
- cloudstack-network
restart: unless-stopped
networks:
cloudstack-network:
driver: bridge
volumes:
mysql-data:
mode: '0644'
- name: Deploy CloudStack containers
community.docker.docker_compose_v2:
project_src: "{{ cloudstack_workspace }}"
state: present
- name: Wait for CloudStack management to be ready
uri:
url: "http://localhost:8080/client"
method: GET
status_code: 200
register: result
until: result.status == 200
retries: 60
delay: 10
- name: Display CloudStack access information
debug:
msg: "CloudStack management UI available at http://{{ inventory_hostname }}:8080/client"
ansible-playbook -i inventory.ini cloudstack-docker.yml --extra-vars "mysql_root_password=secure_password cloud_mysql_password=secure_password"