-
Notifications
You must be signed in to change notification settings - Fork 0
/
Makefile
207 lines (183 loc) · 6.38 KB
/
Makefile
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
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
# Set the Makefile default goal
.DEFAULT_GOAL := help
# Define target .SILENT: to disable printing by default
# Use the "DEBUG=1" flag to make process more talkative
# example: "make DEBUG=1 help"
ifndef DEBUG
.SILENT:
endif
# Load variables from terraform/inputs.hcl to show them in the main menu
AWS_PROFILE := $(shell grep aws_profile terraform/inputs.hcl | cut -d '"' -f2)
AWS_REGION := $(shell grep aws_region terraform/inputs.hcl | cut -d '"' -f2)
AWS_ACCESS := $(shell grep aws_access terraform/inputs.hcl | cut -d '"' -f2)
AWS_USE_SPOT := $(shell grep aws_use_spot terraform/inputs.hcl | cut -d '"' -f2)
# Detect OS
UNAME := $(shell uname)
ifeq ($(UNAME), Darwin)
TARGET = check-mac build deploy provision clean
else ifeq ($(UNAME), Linux)
TARGET = check-linux build deploy provision clean
else
TARGET = wrong-platform
endif
# Service targets (will never be called directly)
logo:
clear
head -n 9 README.md | tail -n 8
echo
notice:
[ "${AWS_PROFILE}" ] && echo "🪪 AWS profile in use: $(AWS_PROFILE)" || true
[ "${AWS_REGION}" ] && echo "📍 AWS region in use: $(AWS_REGION)" || true
[ "${AWS_ACCESS}" ] && echo "🔑 AWS access key id in use: $(AWS_ACCESS)" || true
[ "${AWS_USE_SPOT}" == true ] && echo "☁️ AWS capacity type: spot" || echo "☁️ AWS capacity type: on-demand"
echo
echo "➤ Run \"make config\" to configure AWS account"
echo "(or directly edit file terraform/inputs.hcl)"
echo
check-mac: logo
echo "🍏 Checking env requirements in mac ..."
echo
command -v docker &>/dev/null || \
(echo "❌ Error: Docker required"; \
echo "Visit https://docs.docker.com/desktop/mac/install/"; \
echo; \
exit 1)
docker info &>/dev/null || \
(echo "❌ Error: Docker Desktop is not running"; \
echo; \
exit 1)
echo "✅ OK..."
echo
check-linux: logo
echo "🐧 Checking linux env requirements..."
echo
command -v docker &>/dev/null || \
(echo "❌ Error: Docker required"; \
echo "Visit https://docs.docker.com/engine/install/"; \
echo; \
exit 1)
docker info &>/dev/null || \
(echo "❌ Error: Docker daemon is not running"; \
exit 1)
echo "✅ OK..."
echo
wrong-platform: logo
echo "❌ Error: Wrong platform (only Mac and Linux are supported)"
echo
# 🗄️ Common targets
install: $(TARGET) ## 🚀 Install YACVM
uninstall: logo destroy clean ## 🗑️ Destroy deployed infrastructure
config: logo ## 🔐 Configure AWS account credentials
read -p "🪪 Enter AWS Profile (press \"Enter\" to skip): " AWS_PROFILE ;\
if [ ! -z $$AWS_PROFILE ]; then \
sed -i.bak s/aws_profile.*/aws_profile\ =\ \"$$AWS_PROFILE\"/g terraform/inputs.hcl; \
echo AWS Profile now is $$AWS_PROFILE; \
else \
echo AWS Profile unchanged; \
fi ;\
echo
read -p "📍 Enter AWS Region. Default us-east-1 (press \"Enter\" to skip): " AWS_REGION ;\
if [ ! -z $$AWS_REGION ]; then \
sed -i.bak s/aws_region.*/aws_region\ =\ \"$$AWS_REGION\"/g terraform/inputs.hcl; \
echo AWS Region now is $$AWS_REGION; \
else \
echo AWS Region unchanged; \
fi ;\
echo
read -p "🔑 Enter AWS Access Key ID (press \"Enter\" to skip): " AWS_ACCESS ;\
if [ ! -z $$AWS_ACCESS ]; then \
sed -i.bak s/aws_access_key_id.*/aws_access_key_id\ =\ \"$$AWS_ACCESS\"/g terraform/inputs.hcl; \
echo AWS Access Key ID now is $$AWS_ACCESS; \
else \
echo AWS Access Key ID unchanged; \
fi ;\
echo
read -p "🔐 Enter AWS Secret Access Key (press \"Enter\" to skip): " AWS_SECRET ;\
if [ ! -z $$AWS_SECRET ]; then \
sed -i.bak s/aws_secret_access_key.*/aws_secret_access_key\ =\ \"$$AWS_SECRET\"/g terraform/inputs.hcl; \
echo AWS Secret Access Key now is $$AWS_SECRET; \
else \
echo AWS Secret Access Key unchanged; \
fi ;\
echo
read -p "☁️ Would you like to use AWS spot instances [true|false]? (press \"Enter\" to skip): " AWS_USE_SPOT ;\
if [ ! -z $$AWS_USE_SPOT ]; then \
sed -i.bak s/aws_use_spot.*/aws_use_spot\ =\ \"$$AWS_USE_SPOT\"/g terraform/inputs.hcl; \
else \
echo AWS capacity type unchanged; \
fi ;\
echo
build: logo
echo "🏗 Building Docker image..."
echo
docker build -t yacvm . -f Dockerfile
echo "✅ OK..."
echo
dry-run: logo ## 🖇️ Dry run of infrastructure deployment (no real changes)
echo "🏝 Running terraform plan..."
echo
docker run --rm -v `pwd`:/code -v $$HOME/.aws:/home/user/.aws \
yacvm sh -c "cd terraform && terragrunt plan"
echo "✅ OK..."
echo
deploy: logo ## 💡 (re)Deploy the infrastructure
echo "🏝 Running terraform apply..."
echo
docker run --rm -v `pwd`:/code -v $$HOME/.aws:/home/user/.aws \
yacvm sh -c "cd terraform && terragrunt apply"
echo "✅ OK..."
echo
ping: logo ## 📡 Check server reachability
echo "📡 Running Ansible ping..."
echo
if [ -f artifacts/inventory ]; then \
docker run --rm -v `pwd`:/code yacvm sh -c \
"cd ansible && ansible all -m ping"; \
else \
echo "❌ Error: ansible inventory not found"; \
echo "Please make sure you already have a deployed server,"; \
echo "or perform a new deployment with make install."; \
exit 1; \
fi ;\
echo
provision: logo
echo "🏝 Running Ansible playbook..."
echo
docker run --rm -v `pwd`:/code yacvm sh -c \
"cd ansible && ansible-playbook main.yml"
echo "✅ OK..."
echo
destroy: logo
echo "🗑️ Destroying deployed infrastructure..."
echo
docker run --rm -v `pwd`:/code -v $$HOME/.aws:/home/user/.aws \
yacvm sh -c "cd terraform && terragrunt destroy"
echo "✅ OK..."
echo
clean: logo
echo "🧹 Cleanup..."
echo
rm -f ansible/ubuntu-bionic-18.04-cloudimg-console.log \
terraform/_setup.tf terraform/_backend.tf terraform/inputs.hcl.bak \
terraform/terraform.tfstate.backup
echo "✅ OK..."
echo
ifeq (vpnconfig,$(firstword $(MAKECMDGOALS)))
OVPN_NAME := $(wordlist 2,$(words $(MAKECMDGOALS)),$(MAKECMDGOALS))
ifndef OVPN_NAME
$(error ❌ VPN config name is not defined. Try "make vpnconfig elonmusk")
endif
$(eval $(OVPN_NAME):;@:)
endif
vpnconfig: ## 🪪 Issue VPN config
echo "🪪 Generating VPN configuration..."
docker run --rm -v `pwd`:/code -v $$HOME/.aws:/home/user/.aws \
yacvm sh -c \
"cd ansible && ansible-playbook main.yml -t client -e clientname=$(OVPN_NAME)"
echo "✅ OK..."
echo
# https://marmelab.com/blog/2016/02/29/auto-documented-makefile.html
help: logo notice
grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | \
awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'
.PHONY: * vpnconfig