-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathTaskfile.yml
More file actions
126 lines (112 loc) · 3.96 KB
/
Copy pathTaskfile.yml
File metadata and controls
126 lines (112 loc) · 3.96 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
# https://taskfile.dev
version: "3"
includes:
ssh: Taskfile.ssh.yml
argocd: Taskfile.argocd.yml
ansible: Taskfile.ansible.yml
dotenv:
- .env
vars:
TMP_PATH: ./tmp
SSH_KEYS_NAME: demo
SSH_KEYS_PATH: "{{ .TMP_PATH }}"
SSH_PRIV_KEY_FILE: "{{ .SSH_KEYS_PATH }}/{{.SSH_KEYS_NAME}}"
SSH_PUB_KEY_FILE: "{{ .SSH_PRIV_KEY_FILE }}.pub"
tasks:
init:
desc: "Create temp dirs"
cmds:
- mkdir -p {{ .TMP_PATH }}
- mkdir -p {{ .SSH_KEYS_PATH }}
ssh-gen:
deps:
- init
desc: Generate ssh keys for VMs
cmds:
- echo "🚀 Generate ssh keys {{ .SSH_PRIV_KEY_FILE }}"
- yes | ssh-keygen -t rsa -b 1024 -f "{{ .SSH_PRIV_KEY_FILE }}" -N "" -C "{{ .SSH_KEYS_NAME }}" -v
- chmod 0600 {{ .SSH_PRIV_KEY_FILE }} {{ .SSH_PUB_KEY_FILE }}
status:
- test -f "{{ .SSH_PRIV_KEY_FILE }}"
- test -f "{{ .SSH_PUB_KEY_FILE }}"
check-ssh:
desc: Validate SSH key pair
cmds:
- 'ssh-keygen -y -f "{{ .SSH_PRIV_KEY_FILE }}" 2>/dev/null | diff -q - "{{ .SSH_PUB_KEY_FILE }}" >/dev/null && echo "SSH key pair is valid" || (echo "Public key does not match private key" && exit 1)'
update-ssh:
vars:
SSH_PUB_KEY:
sh: cat "{{ .SSH_PUB_KEY_FILE }}"
desc: Update public ssh keys in cloudinit
deps:
- ssh-gen
cmds:
- echo "🚀 Update ssh keys"
- |
SSH_PUB_KEY=$(cat "{{ .SSH_PUB_KEY_FILE }}")
SSH_PUB_KEY_ESCAPED=$(echo "$SSH_PUB_KEY" | sed 's/[[\.*^$()+?{|]/\\&/g')
if [[ "$(uname)" == "Darwin" ]]; then
# macOS
export LC_CTYPE=C # Ensure sed handles text properly on macOS
grep -rwl "demo" | xargs sed -i '' "s|ssh-rsa [^ ]* demo|${SSH_PUB_KEY_ESCAPED}|g"
unset LC_CTYPE # Clean up environment variable after execution
else
# Linux
grep -rwl "demo" | xargs sed -i "s|ssh-rsa [^ ]* demo|${SSH_PUB_KEY_ESCAPED}|g"
fi
update-password:
desc: Update password for users
cmds:
- echo "🚀 Generate password hash from >>${PASSWORD}<<"
- |
find . -name "*.yaml" -exec yq eval --inplace 'with(select(.kind == "User"); .spec.password="'$(echo "${PASSWORD}" | htpasswd -BinC 14 "" | cut -d: -f2 | base64 -w0)'")' '{}' \;
update-fqdn:
desc: Update FQDN for ingress and dexauthenticator
cmds:
- echo "🚀 Update FQDN"
- |
yq -i '(.spec.rules[]?.host |= env(FQDN)) | (.spec.tls[].hosts[] |= env(FQDN))' ./k8s/demo-app/ingress.yaml
yq -i '(.spec.dnsNames[]? |= env(FQDN))' ./k8s/demo-app/cert.yaml
yq -i '(.spec.applicationDomain |= env(FQDN))' ./k8s/demo-app/dex.yaml
update:
cmds:
- task: init
- task: ssh-gen
- task: update-ssh
- task: update-password
- task: update-fqdn
deploy:
desc: Deploy demo APP infra
vars:
start_time:
sh: date +%s
cmds:
- task: update
- echo "🚀 Deploy APP"
- kubectl apply -k ./k8s/projects
- kubectl get project -o name | xargs kubectl wait --for='jsonpath={.status.state}=Deployed' --timeout=360s
- kubectl apply -k ./k8s
- kubectl -n demo-db get vm -o name | xargs kubectl -n demo-db wait --for='jsonpath={.status.phase}=Running' --timeout=360s
- kubectl -n demo-app get vm -o name | xargs kubectl -n demo-app wait --for='jsonpath={.status.phase}=Running' --timeout=360s
- |
export end_time=$(date +%s)
difference=$((end_time - {{.start_time}}))
if [[ "$(uname)" == "Darwin" ]]; then
# macOS
date -ur "$difference" +'%H:%M:%S'
else
# Linux
date -ud "@$difference" +'%H:%M:%S'
fi
undeploy:
desc: Remove demo APP infra
cmds:
- kubectl delete -k ./k8s || true
- kubectl delete -k ./k8s/projects || true
kill-vms:
desc: Kill VM
cmds:
- kubectl -n demo-app delete vm --all
- kubectl -n demo-app delete vd --all
- kubectl -n demo-db delete vm --all
- kubectl -n demo-db delete vd --all