Skip to content

Commit a63ed18

Browse files
committed
Ansible version
1 parent ccde856 commit a63ed18

6 files changed

Lines changed: 209 additions & 62 deletions

File tree

.ansible/ansible.cfg

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
[defaults]
2+
host_key_checking = False
3+
inventory = inventory_aws_ec2.yaml
4+
5+
enable_plugins = aws_ec2
6+
7+
remote_user = ec2-user
8+
private_key_file = ~/.ssh-key.pem
Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
---
2+
- name: Install Docker
3+
hosts: tag_Role_docker_server
4+
become: yes
5+
become_user: root
6+
tasks:
7+
- name: Make sure docker is installed
8+
yum:
9+
name: docker
10+
state: present
11+
update_cache: yes
12+
13+
- name: Install docker compose
14+
hosts: tag_Role_docker_server
15+
become: yes
16+
become_user: kithupag
17+
tasks:
18+
- name: Create docker compose directory
19+
file:
20+
path: ~/.docker/cli-plugins
21+
state: directory
22+
23+
- name: Get architecture
24+
shell: uname -m
25+
register: architecture
26+
27+
- name: Download docker compose
28+
get_url:
29+
url: https://github.com/docker/compose/releases/latest/download/docker-compose-linux-{{ architecture.stdout }}
30+
dest: ~/.docker/cli-plugins/docker-compose
31+
mode: +x
32+
33+
- name: Start docker
34+
hosts: tag_Role_docker_server
35+
become: yes
36+
become_user: root
37+
tasks:
38+
- name: Ensure docker is running
39+
systemd:
40+
name: docker
41+
state: started
42+
enabled: yes
43+
44+
- name: Add kithupag to docker group
45+
user:
46+
name: kithupag
47+
groups: docker
48+
append: yes
49+
50+
- name: Deploy application
51+
hosts: tag_Role_docker_server
52+
become: yes
53+
become_user: kithupag
54+
vars:
55+
image_tag: "{{ image_tag | default('latest') }}"
56+
dockerhub_username: "{{ dockerhub_username }}"
57+
app_dir: ~/task-manager
58+
tasks:
59+
- name: Create app directory
60+
file:
61+
path: "{{ app_dir }}"
62+
state: directory
63+
64+
- name: Write docker-compose file
65+
copy:
66+
dest: "{{ app_dir }}/docker-compose.yaml"
67+
content: |
68+
version: "3.8"
69+
services:
70+
client:
71+
image: {{ dockerhub_username }}/task-manager-client:{{ image_tag }}
72+
ports:
73+
- "80:80"
74+
restart: unless-stopped
75+
depends_on:
76+
- server
77+
78+
server:
79+
image: {{ dockerhub_username }}/task-manager-server:{{ image_tag }}
80+
ports:
81+
- "3000:3000"
82+
restart: unless-stopped
83+
env_file:
84+
- .env
85+
86+
- name: Copy .env file to app directory
87+
copy:
88+
src: .env
89+
dest: "{{ app_dir }}/.env"
90+
mode: '0600'
91+
ignore_errors: yes # skip if no .env exists locally
92+
93+
- name: Pull latest images
94+
shell: docker compose pull
95+
args:
96+
chdir: "{{ app_dir }}"
97+
98+
- name: Stop existing containers
99+
shell: docker compose down --remove-orphans
100+
args:
101+
chdir: "{{ app_dir }}"
102+
ignore_errors: yes
103+
104+
- name: Start containers
105+
shell: docker compose up -d
106+
args:
107+
chdir: "{{ app_dir }}"
108+
109+
- name: Verify containers are running
110+
shell: docker compose ps
111+
args:
112+
chdir: "{{ app_dir }}"
113+
register: compose_status
114+
115+
- name: Print container status
116+
debug:
117+
msg: "{{ compose_status.stdout }}"

.ansible/inventory_aws_ec2.yaml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
---
2+
plugin: aws_ec2
3+
regions:
4+
- ap-southeast-1
5+
keyed_groups:
6+
- key: tags
7+
prefix: tag
8+
- key: instance_type
9+
prefix: instance_type

.github/workflows/deploy.yml

Lines changed: 47 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -1,104 +1,89 @@
11
name: Build and Deploy
22

33
on:
4-
push:
5-
branches: [ main, feature/terraform-eks ]
4+
push:
5+
branches: [ main, feature/ansible ]
66

77
jobs:
88
build-and-push:
99
runs-on: ubuntu-latest
10+
outputs:
11+
image_tag: ${{ steps.meta.outputs.tags }}
1012

1113
steps:
1214
- name: Checkout code
1315
uses: actions/checkout@v4
1416

15-
- name: Log in to secrets
17+
- name: Log in to Docker Hub
1618
uses: docker/login-action@v3
1719
with:
1820
username: ${{ secrets.DOCKERHUB_USERNAME }}
1921
password: ${{ secrets.DOCKERHUB_TOKEN }}
2022

21-
- name: Build and Push client
23+
- name: Extract Docker metadata
24+
id: meta
25+
uses: docker/metadata-action@v5
26+
with:
27+
images: ${{ secrets.DOCKERHUB_USERNAME }}/task-manager
28+
tags: |
29+
type=sha,prefix=,format=short
30+
31+
- name: Build and push Docker image (client)
2232
uses: docker/build-push-action@v5
2333
with:
2434
context: ./client
2535
push: true
26-
tags: |
27-
${{ secrets.DOCKERHUB_USERNAME }}/client:${{ github.run_number }}
28-
${{ secrets.DOCKERHUB_USERNAME }}/client:latest
36+
tags: ${{ secrets.DOCKERHUB_USERNAME }}/task-manager-client:${{ github.sha }}
2937

30-
- name: Build and Push server
38+
- name: Build and push Docker image (server)
3139
uses: docker/build-push-action@v5
3240
with:
3341
context: ./server
3442
push: true
35-
tags: |
36-
${{ secrets.DOCKERHUB_USERNAME }}/server:${{ github.run_number }}
37-
${{ secrets.DOCKERHUB_USERNAME }}/server:latest
38-
39-
provision:
40-
runs-on: ubuntu-latest
41-
needs: build-and-push
42-
43-
steps:
44-
- name: Checkout code
45-
uses: actions/checkout@v4
46-
47-
- name: Configure AWS Credentials
48-
uses: aws-actions/configure-aws-credentials@v2
49-
with:
50-
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
51-
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY}}
52-
aws-region: ${{ secrets.AWS_REGION }}
53-
54-
- name: Setup Terraform
55-
uses: hashicorp/setup-terraform@v2
56-
57-
- name: Terraform Init
58-
run: terraform -chdir=infra init
43+
tags: ${{ secrets.DOCKERHUB_USERNAME }}/task-manager-server:${{ github.sha }}
5944

60-
- name: Terraform Plan
61-
run: terraform -chdir=infra plan
62-
63-
- name: Terraform Apply
64-
run: terraform -chdir=infra apply -auto-approve
6545
deploy:
6646
runs-on: ubuntu-latest
67-
needs: provision
47+
needs: build-and-push
6848

6949
steps:
7050
- name: Checkout code
7151
uses: actions/checkout@v4
7252

73-
- name: Configure AWS Credentials
74-
uses: aws-actions/configure-aws-credentials@v2
75-
with:
76-
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
77-
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY}}
78-
aws-region: ${{ secrets.AWS_REGION }}
79-
80-
- name: Set up kubectl
81-
uses: azure/setup-kubectl@v3
53+
- name: Write SSH private key for Ansible droplet
54+
run: |
55+
mkdir -p ~/.ssh
56+
echo "${{ secrets.ANSIBLE_DROPLET_SSH_KEY }}" > ~/.ssh/ansible_droplet.pem
57+
chmod 600 ~/.ssh/ansible_droplet.pem
8258
83-
- name: Configure kubeconfig
59+
- name: Write EC2 SSH key (used by Ansible on the droplet)
8460
run: |
85-
aws eks update-kubeconfig --region ${{ secrets.AWS_REGION }} --name ${{ secrets.EKS_CLUSTER_NAME }}
61+
echo "${{ secrets.EC2_SSH_KEY }}" > /tmp/ssh-key.pem
62+
chmod 600 /tmp/ssh-key.pem
8663
87-
- name: Update image tags
64+
- name: Copy Ansible files to droplet
8865
run: |
89-
sed -i "s|image: ${{ secrets.DOCKERHUB_USERNAME }}/server:.*|image: ${{ secrets.DOCKERHUB_USERNAME }}/server:${{ github.run_number }}|" k8s/backend/deployment.yaml
90-
sed -i "s|image: ${{ secrets.DOCKERHUB_USERNAME }}/client:.*|image: ${{ secrets.DOCKERHUB_USERNAME }}/client:${{ github.run_number }}|" k8s/frontend/deployment.yaml
66+
scp -i ~/.ssh/ansible_droplet.pem \
67+
-o StrictHostKeyChecking=no \
68+
-r .ansible/ \
69+
${{ secrets.ANSIBLE_DROPLET_USER }}@${{ secrets.ANSIBLE_DROPLET_HOST }}:~/ansible/
9170
92-
- name: Deploy to EKS Cluster
71+
- name: Copy EC2 SSH key to droplet
9372
run: |
94-
kubectl apply -f k8s/postgres/secret.yaml
95-
kubectl apply -f k8s/postgres/deployment.yaml
96-
kubectl apply -f k8s/backend/deployment.yaml
97-
kubectl apply -f k8s/frontend/deployment.yaml
98-
kubectl rollout status deployment/backend --timeout=300s
99-
kubectl rollout status deployment/frontend --timeout=300s
73+
scp -i ~/.ssh/ansible_droplet.pem \
74+
-o StrictHostKeyChecking=no \
75+
/tmp/ssh-key.pem \
76+
${{ secrets.ANSIBLE_DROPLET_USER }}@${{ secrets.ANSIBLE_DROPLET_HOST }}:~/.ssh-key.pem
10077
101-
- name: Verify deployment
78+
- name: Run Ansible playbook on droplet
10279
run: |
103-
kubectl get pods
104-
kubectl get services
80+
ssh -i ~/.ssh/ansible_droplet.pem \
81+
-o StrictHostKeyChecking=no \
82+
${{ secrets.ANSIBLE_DROPLET_USER }}@${{ secrets.ANSIBLE_DROPLET_HOST }} \
83+
"cd ~/ansible && \
84+
export AWS_ACCESS_KEY_ID=${{ secrets.AWS_ACCESS_KEY_ID }} && \
85+
export AWS_SECRET_ACCESS_KEY=${{ secrets.AWS_SECRET_ACCESS_KEY }} && \
86+
export AWS_REGION=ap-southeast-1 && \
87+
ansible-playbook deploy-docker-new-user.yaml \
88+
-e image_tag=${{ github.sha }} \
89+
-e dockerhub_username=${{ secrets.DOCKERHUB_USERNAME }}"

.gitignore

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,31 @@ infra/bootstrap/*.tfvars
2121
# tf lock files
2222
infra/.terraform.lock.hcl
2323
infra/bootstrap/.terraform.lock.hcl
24+
25+
# SSH & secrets
26+
*.pem
27+
*.key
28+
.env
29+
.env.*
30+
31+
# Ansible secrets
32+
ansible/vault_pass.txt
33+
ansible/.vault_pass
34+
35+
# Node
36+
node_modules/
37+
client/node_modules/
38+
server/node_modules/
39+
40+
# Build output
41+
client/dist/
42+
client/build/
43+
server/dist/
44+
45+
# Logs
46+
*.log
47+
npm-debug.log*
48+
49+
# OS
50+
.DS_Store
51+
Thumbs.db

1-0.1.2.tgz

6.78 KB
Binary file not shown.

0 commit comments

Comments
 (0)