Skip to content

Commit 9f0a2a9

Browse files
feat: add ansible to deployment pipeline
1 parent 1fe7b4a commit 9f0a2a9

File tree

4 files changed

+96
-65
lines changed

4 files changed

+96
-65
lines changed

.github/workflows/terraform-deploy.yml

Lines changed: 10 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -54,69 +54,14 @@ jobs:
5454
sleep 60
5555
echo "Instance should be ready now"
5656
57-
- name: Install Docker on EC2 instance
58-
uses: appleboy/[email protected]
59-
with:
60-
host: ${{ steps.terraform.outputs.public_ip }}
61-
username: ${{ vars.AWS_EC2_USER }}
62-
key: ${{ secrets.AWS_EC2_PRIVATE_KEY }}
63-
script: |
64-
# Add Docker's official GPG key
65-
sudo apt-get update
66-
sudo apt-get install -y ca-certificates curl
67-
sudo install -m 0755 -d /etc/apt/keyrings
68-
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
69-
sudo chmod a+r /etc/apt/keyrings/docker.asc
70-
71-
# Add the repository to Apt sources
72-
echo \
73-
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
74-
$(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
75-
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
76-
77-
# Install Docker
78-
sudo apt-get update
79-
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
80-
81-
# Add user to docker group
82-
sudo usermod -a -G docker ${{ vars.AWS_EC2_USER }}
83-
84-
# Apply group changes without logout
85-
newgrp docker
86-
87-
- name: Copy Docker Compose File From Repo to VM Host
88-
uses: appleboy/[email protected]
89-
with:
90-
host: ${{ steps.terraform.outputs.public_ip }}
91-
username: ${{ vars.AWS_EC2_USER }}
92-
key: ${{ secrets.AWS_EC2_PRIVATE_KEY }}
93-
source: "deployment/compose.aws.yml"
94-
target: "/home/${{ vars.AWS_EC2_USER }}/deployment"
95-
strip_components: 1
96-
overwrite: true
97-
98-
- name: SSH to VM and Create .env.prod
99-
uses: appleboy/[email protected]
100-
with:
101-
host: ${{ steps.terraform.outputs.public_ip }}
102-
username: ${{ vars.AWS_EC2_USER }}
103-
key: ${{ secrets.AWS_EC2_PRIVATE_KEY }}
104-
script: |
105-
cd /home/${{ vars.AWS_EC2_USER }}
106-
rm -f .env.prod
107-
touch .env.prod
108-
echo "EC2_PUBLIC_IP=${{ steps.terraform.outputs.public_ip }}" >> .env.prod
109-
echo "CLIENT_HOST=client.${{ steps.terraform.outputs.public_ip }}.nip.io" >> .env.prod
110-
echo "SERVER_HOST=api.${{ steps.terraform.outputs.public_ip }}.nip.io" >> .env.prod
111-
echo "PUBLIC_API_URL=https://api.${{ steps.terraform.outputs.public_ip }}.nip.io" >> .env.prod
57+
- name: Setup Ansible
58+
run: |
59+
python -m pip install --upgrade pip
60+
pip install ansible
11261
113-
- name: SSH to VM and Execute Docker-Compose Up
114-
uses: appleboy/[email protected]
115-
with:
116-
host: ${{ steps.terraform.outputs.public_ip }}
117-
username: ${{ vars.AWS_EC2_USER }}
118-
key: ${{ secrets.AWS_EC2_PRIVATE_KEY }}
119-
script: |
120-
cd /home/${{ vars.AWS_EC2_USER }}
121-
echo ${{ secrets.GITHUB_TOKEN }} | docker login ghcr.io -u ${{ github.actor }} --password-stdin
122-
docker compose -f deployment/compose.aws.yml --env-file=/home/${{ vars.AWS_EC2_USER }}/.env.prod up -d
62+
- name: Run Ansible Playbook
63+
run: |
64+
cd infrastructure/ansible
65+
EC2_PUBLIC_IP=${{ steps.terraform.outputs.public_ip }} \
66+
AWS_EC2_USER=${{ vars.AWS_EC2_USER }} \
67+
ansible-playbook -i inventory.yml playbooks/deploy.yml
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
all:
2+
hosts:
3+
app_server:
4+
ansible_host: "{{ lookup('env', 'EC2_PUBLIC_IP') }}"
5+
ansible_user: "{{ lookup('env', 'AWS_EC2_USER') }}"
6+
ansible_ssh_private_key_file: "vockey.pem"
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
---
2+
- name: Deploy application
3+
hosts: app_server
4+
become: yes
5+
vars:
6+
app_user: "{{ ansible_user }}"
7+
app_dir: "/home/{{ app_user }}"
8+
deployment_dir: "{{ app_dir }}/deployment"
9+
10+
tasks:
11+
- name: Install required packages
12+
apt:
13+
name:
14+
- apt-transport-https
15+
- ca-certificates
16+
- curl
17+
- software-properties-common
18+
state: present
19+
update_cache: yes
20+
21+
- name: Add Docker GPG key
22+
apt_key:
23+
url: https://download.docker.com/linux/ubuntu/gpg
24+
state: present
25+
26+
- name: Add Docker repository
27+
apt_repository:
28+
repo: "deb [arch={{ ansible_architecture }}] https://download.docker.com/linux/ubuntu {{ ansible_distribution_release }} stable"
29+
state: present
30+
update_cache: yes
31+
32+
- name: Install Docker packages
33+
apt:
34+
name:
35+
- docker-ce
36+
- docker-ce-cli
37+
- containerd.io
38+
- docker-buildx-plugin
39+
- docker-compose-plugin
40+
state: present
41+
update_cache: yes
42+
43+
- name: Add user to docker group
44+
user:
45+
name: "{{ app_user }}"
46+
groups: docker
47+
append: yes
48+
49+
- name: Create deployment directory
50+
file:
51+
path: "{{ deployment_dir }}"
52+
state: directory
53+
mode: "0755"
54+
55+
- name: Copy docker-compose file
56+
copy:
57+
src: ../../deployment/compose.aws.yml
58+
dest: "{{ deployment_dir }}/compose.aws.yml"
59+
mode: "0644"
60+
61+
- name: Create .env.prod file
62+
template:
63+
src: ../templates/env.prod.j2
64+
dest: "{{ app_dir }}/.env.prod"
65+
mode: "0644"
66+
67+
- name: Start Docker Compose
68+
docker_compose:
69+
project_src: "{{ deployment_dir }}"
70+
files:
71+
- compose.aws.yml
72+
state: present
73+
build: yes
74+
remove_orphans: yes
75+
environment:
76+
DOCKER_BUILDKIT: 1
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
EC2_PUBLIC_IP={{ lookup('env', 'EC2_PUBLIC_IP') }}
2+
CLIENT_HOST=client.{{ lookup('env', 'EC2_PUBLIC_IP') }}.nip.io
3+
SERVER_HOST=api.{{ lookup('env', 'EC2_PUBLIC_IP') }}.nip.io
4+
PUBLIC_API_URL=https://api.{{ lookup('env', 'EC2_PUBLIC_IP') }}.nip.io

0 commit comments

Comments
 (0)