-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMakefile
More file actions
172 lines (148 loc) · 6.7 KB
/
Copy pathMakefile
File metadata and controls
172 lines (148 loc) · 6.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
# ──────────────────────────────────────────────────────────────────────────────
# eCommerce IaC Makefile
# Usage: make <target> (e.g. make dev-up, make dev-deploy)
# ──────────────────────────────────────────────────────────────────────────────
SHELL := /bin/bash
ENV ?= dev
TF_DIR = terraform/environments/$(ENV)
ANS_DIR = ansible
INVENTORY = inventories/$(ENV)/hosts.ini
PLAYBOOK = playbooks/site.yml
ANSIBLE_VENV = $(HOME)/ansible-venv
ACTIVATE = . $(ANSIBLE_VENV)/bin/activate &&
IMAGE_URL = https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64.img
IMAGE_FILE = /tmp/ubuntu-22.04-server-cloudimg-amd64.img
SSH_KEY = ~/.ssh/ecommerce_key
.PHONY: help prereqs ssh-key download-image \
tf-init tf-plan tf-apply tf-destroy \
vms-up vms-down vms-status \
ansible-deps deploy deploy-backend deploy-frontend deploy-db deploy-lb deploy-nfs \
ping clean
# ── Help ──────────────────────────────────────────────────────────────────────
help:
@echo ""
@echo " eCommerce IaC — available targets"
@echo " ENV=$(ENV) (override with: make deploy ENV=prod)"
@echo ""
@echo " First-time setup:"
@echo " make prereqs Install Ansible and the Terraform libvirt provider"
@echo " make ssh-key Generate SSH key for VM access"
@echo " make download-image Download Ubuntu 22.04 cloud image"
@echo ""
@echo " Terraform (create VMs):"
@echo " make tf-init terraform init"
@echo " make tf-plan terraform plan"
@echo " make tf-apply terraform apply (creates VMs)"
@echo " make tf-destroy terraform destroy (deletes VMs)"
@echo ""
@echo " VM power management:"
@echo " make vms-up Start all VMs (dependency order)"
@echo " make vms-down Shut down all VMs (reverse order)"
@echo " make vms-status Show running state of all VMs"
@echo ""
@echo " Ansible (configure VMs):"
@echo " make ansible-deps Download Galaxy roles"
@echo " make ping Verify Ansible can reach all VMs"
@echo " make deploy Run full site.yml playbook"
@echo " make deploy-backend Re-deploy only the Django app"
@echo " make deploy-frontend Re-deploy only the React frontend"
@echo ""
# ── Prerequisites ─────────────────────────────────────────────────────────────
prereqs:
@echo ">>> Creating Ansible virtualenv at $(ANSIBLE_VENV)..."
python3 -m venv $(ANSIBLE_VENV)
$(ACTIVATE) pip install --upgrade pip ansible
@echo ">>> Installing Terraform libvirt provider (handled by terraform init)"
@echo ">>> Done."
ssh-key:
@if [ ! -f $(SSH_KEY) ]; then \
ssh-keygen -t ed25519 -f $(SSH_KEY) -N "" -C "ecommerce-iac"; \
echo ">>> Key created: $(SSH_KEY)"; \
echo ">>> Public key (paste into terraform.tfvars):"; \
cat $(SSH_KEY).pub; \
else \
echo ">>> Key already exists: $(SSH_KEY)"; \
cat $(SSH_KEY).pub; \
fi
download-image:
@if [ ! -f $(IMAGE_FILE) ]; then \
echo ">>> Downloading Ubuntu 22.04 cloud image..."; \
wget -O $(IMAGE_FILE) $(IMAGE_URL); \
else \
echo ">>> Image already downloaded: $(IMAGE_FILE)"; \
fi
# ── Terraform ─────────────────────────────────────────────────────────────────
tf-init:
cd $(TF_DIR) && terraform init
tf-plan:
cd $(TF_DIR) && terraform plan
tf-apply:
cd $(TF_DIR) && terraform apply
tf-destroy:
cd $(TF_DIR) && terraform destroy
# ── VM power management ──────────────────────────────────────────────────────
# Startup: db → cache → app → web → lb (dependencies first)
# Shutdown: lb → web → app → cache → db (reverse order)
VM_START_ORDER = db1 cache1 nfs1 app1 app2 web1 web2 lb1
VM_STOP_ORDER = lb1 web2 web1 app2 app1 nfs1 cache1 db1
vms-up:
@netstate=$$(virsh net-info ecommerce-$(ENV) 2>/dev/null | awk '/^Active:/{print $$2}'); \
if [ "$$netstate" != "yes" ]; then \
echo ">>> Starting network ecommerce-$(ENV)..."; \
virsh net-start ecommerce-$(ENV); \
else \
echo ">>> Network ecommerce-$(ENV) is already active"; \
fi
@for vm in $(VM_START_ORDER); do \
state=$$(virsh domstate $$vm 2>/dev/null); \
if [ "$$state" = "running" ]; then \
echo ">>> $$vm is already running"; \
else \
echo ">>> Starting $$vm..."; \
virsh start $$vm; \
sleep 3; \
fi; \
done
@echo ">>> All VMs are up."
vms-down:
@for vm in $(VM_STOP_ORDER); do \
state=$$(virsh domstate $$vm 2>/dev/null); \
if [ "$$state" = "running" ]; then \
echo ">>> Shutting down $$vm..."; \
virsh shutdown $$vm; \
sleep 2; \
else \
echo ">>> $$vm is already stopped"; \
fi; \
done
@echo ">>> All VMs are down."
vms-status:
@echo ""
@echo " VM State"
@echo " ──────────────────────────"
@for vm in $(VM_START_ORDER); do \
state=$$(virsh domstate $$vm 2>/dev/null || echo "not found"); \
printf " %-16s %s\n" "$$vm" "$$state"; \
done
@echo ""
# ── Ansible ───────────────────────────────────────────────────────────────────
ansible-deps:
$(ACTIVATE) cd $(ANS_DIR) && ansible-galaxy install -r requirements.yml
ping:
$(ACTIVATE) cd $(ANS_DIR) && ansible all -i $(INVENTORY) -m ping
deploy:
$(ACTIVATE) cd $(ANS_DIR) && ansible-playbook -i $(INVENTORY) $(PLAYBOOK)
deploy-backend:
$(ACTIVATE) cd $(ANS_DIR) && ansible-playbook -i $(INVENTORY) playbooks/backend.yml
deploy-frontend:
$(ACTIVATE) cd $(ANS_DIR) && ansible-playbook -i $(INVENTORY) playbooks/frontend.yml
deploy-db:
$(ACTIVATE) cd $(ANS_DIR) && ansible-playbook -i $(INVENTORY) playbooks/database.yml
deploy-lb:
$(ACTIVATE) cd $(ANS_DIR) && ansible-playbook -i $(INVENTORY) playbooks/lb.yml
deploy-nfs:
$(ACTIVATE) cd $(ANS_DIR) && ansible-playbook -i $(INVENTORY) playbooks/nfs.yml
clean:
@echo ">>> This will DELETE all $(ENV) VMs. Are you sure? Press Ctrl-C to cancel, Enter to continue."
@read _confirm
make tf-destroy ENV=$(ENV)