-
Notifications
You must be signed in to change notification settings - Fork 69
/
Copy pathchce_loadbalancer.sh
executable file
·183 lines (131 loc) · 3.78 KB
/
chce_loadbalancer.sh
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
#!/bin/bash
#
# Skrypt sprawdza czy HAProxy jest zainstalowane i instaluje jezeli nie.
# Nastepnie za pomocą kreatora tworzy kowa konfigurację load balancera.
#
# Autor: Pawel 'Pawilonek' Kaminski
# Funkcja wyswietla podany tekst i prosi uzytkownika o podanie wartosci
_ask_input() {
local text=$1
local default=$2
if [[ -n $default ]]
then
text="$text [domyślnie: $default]"
fi
echo -e -n "$text: \e[33m"
read -r userValue
echo -e -n "\e[39m"
result="${userValue:-$default}"
}
# Funkcja sprawdza, czy podany serwis jest już zainstalowany
_service_exists() {
local service=$1
if [[ $(systemctl list-units --all -t service --full --no-legend "$service.service" | sed 's/^\s*//g' | cut -f1 -d' ') == $service.service ]]; then
return 0
else
return 1
fi
}
# Spawdzanie czy uzytkownik jest administratorem
if [ "$(id -u)" != "0" ]; then
echo -e "[\e[31m ERR \e[39m] Musisz uruchomić ten skrypt jako root:"
echo " sudo $0"
exit 1
fi
##########
# Instalowanie zaleznosci
#
echo -e "[\e[34m i \e[39m] Instalowanie HAProxy"
# Spawdzanie czy HAProxy jest juz zainstalowane
if _service_exists haproxy; then
echo -e "[\e[32m OK \e[39m] Jest już zainstalowane"
else
apt update
apt install -y haproxy
echo -e "[\e[32m OK \e[39m] zainstalowane"
fi
##########
# Sprawdzanie obecnej konfiguracji
#
haproxy -c -V -f /etc/haproxy/haproxy.cfg
if [ $? -ne 0 ]; then
echo -e "[\e[31m ERR \e[39m] Twoja obecna konfiguracja serwera HAProxy jest niepoprawna"
echo -e "[\e[31m ERR \e[39m] Sprawdź plik /etc/haproxy/haproxy.cfg"
exit 1
fi
##########
# Zbieranie danych od uzytkownika
#
echo -e "[\e[34m i \e[39m] Dodawanie nowej konfiguracji"
# Generowanie losowej nazwy
randomName=$(echo $RANDOM | md5sum | head -c 5)
_ask_input "Nazwa serwisu" "$randomName"
name=$result
_ask_input "Na jakim porcie nasłuchiwać" "80"
port=$result
servers=()
echo "Podaj listę adresów z portem na jakie ruch ma być przekierowany. Pusta linijka kończy wpisywanie."
echo "Przykładowe wartości:"
echo " 127.0.0.1:80"
echo " mikrus:443"
echo ""
_ask_input "1"
server=$result
i=1
while [[ -n $server ]]
do
servers+=("$server")
((i=i+1))
_ask_input "$i"
server=$result
done
# Spawdzanie czy zostal podany przynajmniej jeden serwer
if [ ${#servers[@]} -eq 0 ]; then
echo -e "[\e[31m ERR \e[39m] Musisz podać przynajmniej jeden serwer"
exit 1
fi
##########
# Przygotowanie nowj konfiguracji
#
# Pozbywamy sie spacji z nazwy
name="${name// /_}"
# Przygotowanie przykladowej konfiguracji
config=$(cat <<-END
frontend ${name}_front
# Słuchaj na porcie ${port} ipv4 i ipv6
bind *:${port}
bind [::]:${port} v4v6
# I przekerowuj ruch na serwery pod nazwą ${name}_backend_servers
default_backend ${name}_backend_servers
backend ${name}_backend_servers
# Rozkładaj ruch za pomocą karuzeli (roundrobin)
balance roundrobin
# I przekerowuj ruch na następujące serwery
END
)
# Dodanie do konfiguracj serwerow
i=0
for address in "${servers[@]}"
do
config="${config}
server srv${i} ${address} check"
((i=i+1))
done
# Sprawdzanie nowej konfiguracji
tmpConfig=/tmp/${randomName}-haproxy.cfg
cp /etc/haproxy/haproxy.cfg ${tmpConfig}
echo "$config" >> ${tmpConfig}
haproxy -c -V -f ${tmpConfig}
configReturn=$?
rm ${tmpConfig}
if [ $configReturn -ne 0 ]; then
echo -e "[\e[31m ERR \e[39m] Niestety podana konfiguracja jest niepoprawna"
exit 1
fi
# Dodanie nowego wpisu do konfiguracji
echo "$config" >> /etc/haproxy/haproxy.cfg
echo -e "[\e[32m OK \e[39m] Twoja konfiguracja została zapisana w: /etc/haproxy/haproxy.cfg"
# Restart servera HAProxy
echo -e "[\e[34m i \e[39m] Restart serwera"
systemctl restart haproxy
echo -e "[\e[32m OK \e[39m] Gotowe!"