This playbook deploys Capistrano in a Docker container using Ansible. Suitable for CI/CD pipelines or disposable deploy nodes.
---
- name: Deploy Capistrano in Docker
hosts: capistrano_docker
become: true
vars:
capistrano_workspace: /opt/capistrano
capistrano_ruby_version: "3.3"
capistrano_version: "3.20.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 Capistrano workspace directory
file:
path: "{{ capistrano_workspace }}"
state: directory
mode: '0755'
- name: Create Docker Compose file for Capistrano
copy:
dest: "{{ capistrano_workspace }}/docker-compose.yml"
content: |
version: '3.8'
services:
capistrano:
image: ruby:{{ capistrano_ruby_version }}
container_name: capistrano-deploy
working_dir: /workspace
volumes:
- ./projects:/workspace
- $HOME/.ssh:/root/.ssh:ro
entrypoint: ["bash", "-lc", "gem install capistrano -v {{ capistrano_version }} --no-document && cap --version"]
networks:
- deploy-network
restart: "no"
networks:
deploy-network:
driver: bridge
mode: '0644'
- name: Create projects directory
file:
path: "{{ capistrano_workspace }}/projects"
state: directory
mode: '0755'
- name: Deploy Capistrano container
community.docker.docker_compose_v2:
project_src: "{{ capistrano_workspace }}"
state: present
- name: Verify Capistrano installation
command: docker run --rm ruby:{{ capistrano_ruby_version }} bash -lc "gem install capistrano -v {{ capistrano_version }} --no-document && cap --version"
register: cap_version
changed_when: false
- name: Display Capistrano version
debug:
msg: "Capistrano version: {{ cap_version.stdout_lines | last }}"
ansible-playbook -i inventory.ini capistrano-docker.yml