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
|
#!/usr/bin/env bash
#Script that install prerequisites
#author: Szilard Cserey (szilard.cserey@ericsson.com)
#
#Installs qemu-kvm, libvirt and prepares networking for Fuel VM
##VARS
reset=`tput sgr0`
blue=`tput setaf 4`
red=`tput setaf 1`
green=`tput setaf 2`
private_interface='enp6s0'
public_interface='enp8s0'
pxe_bridge='pxebr'
fuel_gw_ip='10.20.0.1/16'
##END VARS
##FUNCTIONS
###check whether qemu-kvm is installed, otherwise install it
install_qemu_kvm() {
echo "${blue}Checking whether qemu-kvm is installed, otherwise install it${reset}"
if ! rpm -qa | grep -iE 'qemu-kvm'; then
echo "${blue}qemu-kvm is not installed, installing...${reset}"
yum -y install qemu-kvm
else
echo "${green}OK!${reset}"
fi
}
###check whether libvirt is installed, otherwise install it
install_libvirt() {
echo "${blue}Checking whether libvirt is installed, otherwise install it${reset}"
if ! rpm -qa | grep -iE 'libvirt'; then
echo "${blue}libvirt is not installed, installing...${reset}"
yum -y install libvirt
else
echo "${green}OK!${reset}"
fi
}
###check whether kvm kernel module is loaded, otherwise load it
load_kvm_kernel_mod() {
echo "${blue}Checking whether kvm kernel module is loaded, otherwise load it${reset}"
if ! lsmod | grep -iE 'kvm'; then
if [[ `lscpu | grep 'Vendor ID' | awk 'BEGIN { FS = ":" } ; {print $2}' | tr -d ' '` == 'GenuineIntel' ]]; then
echo "${blue}Intel processor identified, loading kernel module kvm-intel${reset}"
kernel_mod='kvm-intel'
modprobe ${kernel_mod}
fi
if [[ `lscpu | grep 'Vendor ID' | awk 'BEGIN { FS = ":" } ; {print $2}' | tr -d ' '` == 'AuthenticAMD' ]]; then
echo "${blue}AMD processor identified, loading kernel module kvm-amd${reset}"
kernel_mod='kvm-amd'
modprobe ${kernel_mod}
fi
if ! lsmod | grep -iE 'kvm'; then
echo "${red}Failed to load kernel module ${kernel_mod}!${reset}"
exit 1
fi
else
echo "${green}OK!${reset}"
fi
}
###check whether libvirtd service is running otherwise start it
start_libvirtd_service() {
echo "${blue}Checking whether libvirtd service is running otherwise start it${reset}"
if ! sudo systemctl status libvirtd | grep -iE 'active \(running\)'; then
echo "${blue}starting libvirtd service${reset}"
systemctl start libvirtd
if ! sudo systemctl status libvirtd | grep -iE 'active \(running\)'; then
echo "${red}Failed to start libvirtd service!${reset}"
exit 1
fi
else
echo "${green}OK!${reset}"
fi
}
#Check whether interface is UP
check_interface() {
if [ -z $1 ]; then
echo "${red}Cannot bring UP, No interface specified${reset}"
exit 1
fi
local interface=$1
echo "${blue}Checking whether interface ${interface} is UP${reset}"
link_state=$(ip link show ${interface} | grep -oP 'state \K[^ ]+')
if [[ ${link_state} != 'UP' ]]; then
echo "${blue}${interface} state is ${link_state}. Bringing it UP!${reset}"
ip link set dev ${interface} up
sleep 5
link_state=$(ip link show ${interface} | grep -oP 'state \K[^ ]+')
if [[ ${link_state} == 'DOWN' ]]; then
echo "${red}Could not bring UP interface ${interface} link state is ${link_state}${reset}"
exit 1
fi
else
echo "${green}OK!${reset}"
fi
}
setup_pxe_bridge() {
#Check whether private interface exists
echo "${blue}Checking whether private interface ${private_interface} exists${reset}"
if ! ip link show ${private_interface}; then
echo "${red}Private interface ${private_interface} does not exists!${reset}"
exit 1
else
echo "${green}OK!${reset}"
fi
#Check whether private interface is UP
check_interface ${private_interface}
pxe_vid=0
pxe_interface="${private_interface}.${pxe_vid}"
#Check whether VLAN 0 (PXE) interface exists
echo "${blue}Checking whether VLAN 0 (PXE) interface ${pxe_interface} exists${reset}"
if ! ip link show ${pxe_interface}; then
echo "${blue}Creating VLAN 0 (PXE) interface ${pxe_interface}${reset}"
ip link add link ${private_interface} name ${pxe_interface} type vlan id ${pxe_vid}
else
echo "${green}OK!${reset}"
fi
#Check whether VLAN 0 (PXE) interface is UP
check_interface ${pxe_interface}
#Check whether PXE bridge exists
echo "${blue}Checking whether PXE bridge ${pxe_bridge} exists${reset}"
if brctl show ${pxe_bridge} 2>&1 | grep 'No such device'; then
echo "${blue}Creating PXE bridge ${pxe_bridge}${reset}"
brctl addbr ${pxe_bridge}
else
echo "${green}OK!${reset}"
fi
#Add VLAN 0 (PXE) interface to PXE bridge
echo "${blue}Checking whether VLAN 0 (PXE) interface ${pxe_interface} is added to PXE bridge ${pxe_bridge} exists${reset}"
if ! brctl show ${pxe_bridge} 2>&1 | grep ${pxe_interface}; then
echo "${blue}Adding VLAN 0 (PXE) interface ${pxe_interface} to PXE bridge ${pxe_bridge}${reset}"
brctl addif ${pxe_bridge} ${pxe_interface}
if ! brctl show ${pxe_bridge} 2>&1 | grep ${pxe_interface}; then
echo "${red}Could not add VLAN 0 (PXE) interface ${pxe_interface} to PXE bridge ${pxe_bridge}${reset}"
exit 1
fi
else
echo "${green}OK!${reset}"
fi
#Check whether PXE bridge is UP
check_interface ${pxe_bridge}
#Add Fuel Gateway IP Address to PXE bridge
echo "${blue}Checking whether Fuel Gateway IP Address ${fuel_gw_ip} is assigned to PXE bridge ${pxe_bridge}${reset}"
if ! ip addr show ${pxe_bridge} | grep ${fuel_gw_ip}; then
echo "${blue}Adding Fuel Gateway IP Address ${fuel_gw_ip} to PXE bridge ${pxe_bridge}${reset}"
sudo ip addr add ${fuel_gw_ip} dev ${pxe_bridge}
if ! ip addr show ${pxe_bridge} | grep ${fuel_gw_ip}; then
echo "${red}Could not add Fuel Gateway IP Address ${fuel_gw_ip} to PXE bridge ${pxe_bridge}${reset}"
exit 1
fi
else
echo "${green}OK!${reset}"
fi
}
###check whether access to public network is granted
check_access_enabled_to_public_network() {
#Check whether public interface exists
echo "${blue}Checking whether public interface ${public_interface} exists${reset}"
if ! ip link show ${public_interface}; then
echo "${red}Public interface ${public_interface} does not exists!${reset}"
exit 1
else
echo "${green}OK!${reset}"
fi
#Check whether public interface ${public_interface} is UP
check_interface ${public_interface}
echo "${blue}Checking whether access is granted to public network through interface ${public_interface}${reset}"
if ! sudo iptables -t nat -L POSTROUTING -v | grep "MASQUERADE.*${public_interface}.*anywhere.*anywhere"; then
echo "${blue}Enable access to public network through interface ${public_interface}${reset}"
iptables -t nat -A POSTROUTING -o ${public_interface} -j MASQUERADE
else
echo "${green}OK!${reset}"
fi
}
##END FUNCTIONS
main() {
install_qemu_kvm
install_libvirt
load_kvm_kernel_mod
start_libvirtd_service
setup_pxe_bridge
check_access_enabled_to_public_network
}
main "$@"
|