This guide deploys Drone server and Docker runner with Ansible-managed Compose files.
/opt/drone directory.env and docker-compose.yml- name: Deploy Drone CI
hosts: drone
become: true
vars:
drone_root: /opt/drone
drone_host: ci.example.com
drone_proto: https
drone_rpc_secret: change-this-secret
drone_github_client_id: change-me
drone_github_client_secret: change-me
tasks:
- name: Install Docker on Debian family
ansible.builtin.apt:
update_cache: true
name:
- docker.io
- docker-compose-plugin
state: present
when: ansible_os_family == "Debian"
- name: Install Docker on RHEL family
ansible.builtin.dnf:
name:
- docker
- docker-compose-plugin
state: present
when: ansible_os_family == "RedHat"
- name: Enable Docker service
ansible.builtin.systemd:
name: docker
enabled: true
state: started
- name: Create Drone root directory
ansible.builtin.file:
path: "{{ drone_root }}"
state: directory
mode: "0755"
- name: Write Drone environment file
ansible.builtin.copy:
dest: "{{ drone_root }}/.env"
mode: "0600"
content: |
DRONE_SERVER_HOST={{ drone_host }}
DRONE_SERVER_PROTO={{ drone_proto }}
DRONE_RPC_SECRET={{ drone_rpc_secret }}
DRONE_GITHUB_CLIENT_ID={{ drone_github_client_id }}
DRONE_GITHUB_CLIENT_SECRET={{ drone_github_client_secret }}
DRONE_RPC_HOST=drone
DRONE_RPC_PROTO=http
DRONE_RUNNER_CAPACITY=2
DRONE_RUNNER_NAME=runner-01
- name: Write Docker Compose file
ansible.builtin.copy:
dest: "{{ drone_root }}/docker-compose.yml"
mode: "0644"
content: |
services:
drone:
image: drone/drone:2
restart: unless-stopped
ports:
- "8080:80"
env_file:
- .env
volumes:
- drone_data:/data
runner:
image: drone/drone-runner-docker:1
restart: unless-stopped
depends_on:
- drone
env_file:
- .env
volumes:
- /var/run/docker.sock:/var/run/docker.sock
volumes:
drone_data:
- name: Start Drone stack
ansible.builtin.command: docker compose up -d
args:
chdir: "{{ drone_root }}"
ansible-playbook -i inventory.ini drone-install.yml