1 | VAGRANTFILE_API_VERSION = "2" |
---|
2 | ENV['VAGRANT_DEFAULT_PROVIDER'] = "vmware_esxi" |
---|
3 | |
---|
4 | BRANCH=ENV['BRANCH'] || "main" |
---|
5 | BRANCH_EXTRA=ENV['BRANCH_EXTRA'] || BRANCH |
---|
6 | |
---|
7 | #OGAGENTVERSION="1.4.2" |
---|
8 | |
---|
9 | LANGUAGE = "es_ES" |
---|
10 | ENV['LC_ALL'] = LANGUAGE + ".UTF-8" |
---|
11 | |
---|
12 | NCLIENTS = ENV['NUMBER_OF_CLIENTS']|| 4 |
---|
13 | NCLIENTS = NCLIENTS.to_i |
---|
14 | |
---|
15 | SERVERMEM = 2048 # Minimum: 512 |
---|
16 | CLIENTMEM = 512 # Minimum: 256 |
---|
17 | |
---|
18 | MACPREFIX = ENV['OGN_MAC_PREFIX'] || '00:50:56:aa:aa' |
---|
19 | NETPREFIX = ENV['OGN_NET_PREFIX'] || "192.168.2" |
---|
20 | DHCPNET = ENV['DHCPNET'] || "192.168.2.0" |
---|
21 | |
---|
22 | SERVERIP = "#{NETPREFIX}.10" |
---|
23 | |
---|
24 | LOCALWEBPORT = 8443 |
---|
25 | |
---|
26 | ESXIPASSWORD = ENV['ESXI_PASSWORD'] || 'prompt:' |
---|
27 | |
---|
28 | GITEA_TOKEN = ENV['GITEA_TOKEN'] |
---|
29 | GITEA_USER = ENV['GITEA_USER'] || 'unizar' |
---|
30 | SSH_GIT_KEY_PASS = ENV['SSH_GIT_KEY_PASS'] || '' |
---|
31 | |
---|
32 | |
---|
33 | OGSERVERSCRIPT = <<EOT |
---|
34 | echo -n 'hostname: '; hostname -f |
---|
35 | echo env vars beginning with OG: |
---|
36 | env |grep OG |
---|
37 | ip address show eth0 |
---|
38 | |
---|
39 | # Fix problem with gitea host |
---|
40 | grep -q '^150\.214\.58\.246' /etc/hosts || echo "150.214.58.246 ognproject.evlt.uma.es" >> /etc/hosts |
---|
41 | |
---|
42 | echo Setting up SSH config and agent |
---|
43 | mkdir -p /root/.ssh/ |
---|
44 | cp /vagrant/installer/vagrant/config/id_rsa /root/.ssh/id_rsa |
---|
45 | chown root:root /root/.ssh/id_rsa |
---|
46 | chmod 0400 /root/.ssh/id_rsa |
---|
47 | cp /vagrant/installer/vagrant/config/ssh_config /root/.ssh/config |
---|
48 | chown root:root /root/.ssh/config |
---|
49 | chmod 0400 /root/.ssh/config |
---|
50 | cp /vagrant/installer/vagrant/config/ask_pass.sh /root/ask_pass.sh |
---|
51 | chmod 755 /root/ask_pass.sh |
---|
52 | |
---|
53 | eval `ssh-agent` |
---|
54 | export DISPLAY=:0 |
---|
55 | export SSH_ASKPASS=/root/ask_pass.sh |
---|
56 | ssh-add /root/.ssh/id_rsa <<< $SSH_GIT_KEY_PASS |
---|
57 | |
---|
58 | |
---|
59 | ## setup stuff that used to be in the old ubuntu-18 ESXi template but are absent in the current ubuntu-24 one |
---|
60 | apt-get --yes install locales file bsdextrautils moreutils |
---|
61 | sudo sed -i -e '/^# es_ES\.UTF-8/s/^# //' /etc/locale.gen |
---|
62 | sudo sed -i -e '/^# en_US\.UTF-8/s/^# //' /etc/locale.gen |
---|
63 | sudo sed -i -e '/^# en_GB\.UTF-8/s/^# //' /etc/locale.gen |
---|
64 | |
---|
65 | |
---|
66 | echo Setting up language and locales |
---|
67 | export LANG="#{LANGUAGE}.UTF-8" |
---|
68 | echo "LANG=\\\"$LANG\\\"" > /etc/default/locale |
---|
69 | echo "LANG=\\\"$LANG\\\"" >> /etc/environment |
---|
70 | locale-gen --lang #{LANGUAGE} |
---|
71 | sed -i "s/XKBLAYOUT=.*/XKBLAYOUT=\\\"${LANG%_*}\\\"/" /etc/default/keyboard |
---|
72 | dpkg-reconfigure -fnoninteractive console-setup |
---|
73 | |
---|
74 | |
---|
75 | # Exit if OpenGnsys is installed. |
---|
76 | [ -f /opt/opengnsys/doc/VERSION.json ] && echo "Cannot provision, OpenGnsys is already installed." && exit 1 |
---|
77 | |
---|
78 | |
---|
79 | echo Creating a repository disk |
---|
80 | if [ -z "$(blkid /dev/mapper/og-images | grep ext4)" ]; then |
---|
81 | pvcreate /dev/sdb |
---|
82 | vgcreate og /dev/sdb |
---|
83 | vgchange -ay |
---|
84 | lvcreate -ay -n images -l 100%VG og |
---|
85 | mkfs -t ext4 /dev/mapper/og-images |
---|
86 | mkdir -p /opt/opengnsys/images |
---|
87 | echo "/dev/mapper/og-images /opt/opengnsys/images ext4 defaults 0 0" >> /etc/fstab |
---|
88 | mount -a |
---|
89 | fi |
---|
90 | |
---|
91 | |
---|
92 | if [ -f /etc/netplan/01-eth1.yaml ]; then |
---|
93 | echo "Network configured, skipping" |
---|
94 | else |
---|
95 | echo "Configuring eth1" |
---|
96 | sed -i "s/##ADDRESS##/${NETPREFIX}.1/g" /tmp/01-eth1.yaml |
---|
97 | mv /tmp/01-eth1.yaml /etc/netplan |
---|
98 | chown root:root /etc/netplan/01-eth1.yaml |
---|
99 | netplan apply |
---|
100 | while ! ip address show eth0 |grep -qw inet; do |
---|
101 | echo eth0 has no IPv4, waiting... |
---|
102 | sleep 1 |
---|
103 | done |
---|
104 | fi |
---|
105 | |
---|
106 | echo Available ogLive and ogagent files: |
---|
107 | ls -l /vagrant/installer/{ogLive,ogagentpkgs}* |
---|
108 | |
---|
109 | /vagrant/installer/opengnsys_installer_devel_esxi.sh |
---|
110 | |
---|
111 | [ -e /opt/opengnsys/log/bash.log ] && mv /opt/opengnsys/log/bash.log /opt/opengnsys/log/opengnsys_installer.log |
---|
112 | |
---|
113 | echo y | /opt/opengnsys/bin/setserveraddr $(ip -o link show | tail -1 | cut -d: -f2) |
---|
114 | |
---|
115 | # Insert DHCP data. |
---|
116 | sed -i "/^}$/ i host modelo { hardware ethernet #{MACPREFIX}:FF; fixed-address #{NETPREFIX}.199; }" /etc/dhcp/dhcpd.conf |
---|
117 | for ((i=#{NCLIENTS+10}; i>10; i--)); do |
---|
118 | sed -i "/^}$/ i host pc${i} { hardware ethernet #{MACPREFIX}:${i}; fixed-address #{NETPREFIX}.${i}; }" /etc/dhcp/dhcpd.conf |
---|
119 | done |
---|
120 | service isc-dhcp-server restart |
---|
121 | |
---|
122 | echo Creating an aula and some clients |
---|
123 | SQL="INSERT INTO aulas (nombreaula, idcentro, urlfoto, grupoid, ubicacion, puestos, modomul, ipmul, pormul, velmul, router, netmask, ntp, dns, proxy, modp2p, timep2p)"\ |
---|
124 | "VALUES ('Aula virtual', 1, 'aula.jpg', 0, 'Despliegue virtual con Vagrant.', 5, 2, '239.194.2.11', 9000, 70, '#{NETPREFIX}.1', '255.255.255.0', '', '', '', 'peer', 30); "\ |
---|
125 | "INSERT INTO ordenadores (nombreordenador, ip, mac, idaula, idrepositorio, idperfilhard, idmenu, idproautoexec, grupoid, router, mascara, arranque, netiface, netdriver, fotoord) VALUES "\ |
---|
126 | "('modelo', '#{NETPREFIX}.199', REPLACE('#{MACPREFIX}FF',':',''), 1, 1, 0, 0, 0, 0, '#{NETPREFIX}.1', '255.255.255.0', '00unknown', 'eth0', 'generic', 'fotoordenador.gif')," |
---|
127 | for ((i=11; i<=#{NCLIENTS+10}; i++)); do |
---|
128 | SQL="$SQL ('pc$i', '#{NETPREFIX}.$i', REPLACE('#{MACPREFIX}$i',':',''), 1, 1, 0, 0, 0, 0, '#{NETPREFIX}.1', '255.255.255.0', '00unknown', 'eth0', 'generic', 'fotoordenador.gif')," |
---|
129 | done |
---|
130 | mysql -u usuog -ppassusuog -D ogAdmBD -e "${SQL%,}" |
---|
131 | /opt/opengnsys/bin/setclientmode ogLiveAdmin modelo PERM |
---|
132 | /opt/opengnsys/bin/setclientmode ogLiveAdmin pc11 PERM |
---|
133 | for ((i=12; i<=#{NCLIENTS+10}; i++)); do |
---|
134 | /opt/opengnsys/bin/setclientmode ogLive pc$i PERM |
---|
135 | done |
---|
136 | |
---|
137 | echo "Notes:" |
---|
138 | echo "- OpenGnsys Server URL: https://localhost:${LOCALWEBPORT}/opengnsys/" |
---|
139 | exit 0 |
---|
140 | EOT |
---|
141 | |
---|
142 | |
---|
143 | OGDHCPSCRIPT = <<EOT |
---|
144 | echo in ogdhcp script |
---|
145 | echo -n 'hostname: '; hostname -f |
---|
146 | echo env vars beginning with OG: |
---|
147 | env |grep OG |
---|
148 | ip address show eth0 |
---|
149 | echo "OGDHCP_BRANCH ($OGDHCP_BRANCH)" |
---|
150 | EOT |
---|
151 | |
---|
152 | |
---|
153 | OGBOOTSCRIPT = <<EOT |
---|
154 | echo in ogboot script |
---|
155 | echo -n 'hostname: '; hostname -f |
---|
156 | echo env vars beginning with OG: |
---|
157 | env |grep OG |
---|
158 | ip address show eth0 |
---|
159 | echo "OGBOOT_BRANCH ($OGBOOT_BRANCH)" |
---|
160 | echo "OGSERVER_IP ($OGSERVER_IP)" |
---|
161 | #curl --retry 5 --stderr - --insecure --location --output installer.py https://$GITEA_USER:$GITEA_TOKEN@ognproject.evlt.uma.es/gitea/opengnsys/ogboot/raw/branch/ ${OGBOOT_BRANCH}/installer.py |
---|
162 | #python3 /install.py |
---|
163 | EOT |
---|
164 | |
---|
165 | |
---|
166 | OGREPOSCRIPT = <<EOT |
---|
167 | echo in ogrepo script |
---|
168 | echo -n 'hostname: '; hostname -f |
---|
169 | echo env vars beginning with OG: |
---|
170 | env |grep OG |
---|
171 | ip address show eth0 |
---|
172 | echo "OGREPO_BRANCH ($OGREPO_BRANCH)" |
---|
173 | EOT |
---|
174 | |
---|
175 | |
---|
176 | OGLOGSCRIPT = <<EOT |
---|
177 | echo in oglog script |
---|
178 | echo -n 'hostname: '; hostname -f |
---|
179 | echo env vars beginning with OG: |
---|
180 | env |grep OG |
---|
181 | ip address show eth0 |
---|
182 | echo "OGLOG_BRANCH ($OGLOG_BRANCH)" |
---|
183 | EOT |
---|
184 | |
---|
185 | |
---|
186 | Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| |
---|
187 | require 'pp' |
---|
188 | |
---|
189 | def do_debug(msg) |
---|
190 | if ENV.has_key?("DEBUG_VAGRANT") and ENV["DEBUG_VAGRANT"] == "true" then |
---|
191 | if msg.class == Array then |
---|
192 | #PP.pp(msg, STDERR) ## doesn't actually pretty print to the jenkins log |
---|
193 | STDERR.puts msg.pretty_inspect |
---|
194 | else |
---|
195 | STDERR.puts msg |
---|
196 | end |
---|
197 | end |
---|
198 | end |
---|
199 | |
---|
200 | provisioners_env = { |
---|
201 | "NETPREFIX" => NETPREFIX, |
---|
202 | "BRANCH" => BRANCH, |
---|
203 | "OGDHCP_BRANCH" => ENV['OGDHCP_BRANCH'], |
---|
204 | "OGBOOT_BRANCH" => ENV['OGBOOT_BRANCH'], |
---|
205 | "OGREPO_BRANCH" => ENV['OGREPO_BRANCH'], |
---|
206 | "OGLOG_BRANCH" => ENV['OGLOG_BRANCH'], |
---|
207 | "GITEA_TOKEN" => GITEA_TOKEN, |
---|
208 | "GITEA_USER" => GITEA_USER, |
---|
209 | "DHCPNET" => DHCPNET, |
---|
210 | "SSH_GIT_KEY_PASS" => SSH_GIT_KEY_PASS, |
---|
211 | "LOCALWEBPORT" => LOCALWEBPORT, |
---|
212 | "DEFAULT_UDS_REST_URL" => ENV['DEFAULT_UDS_REST_URL'], |
---|
213 | "DEFAULT_UDS_AUTHENTICATOR" => ENV['DEFAULT_UDS_AUTHENTICATOR'], |
---|
214 | "DEFAULT_UDS_USER" => ENV['DEFAULT_UDS_USER'], |
---|
215 | "DEFAULT_UDS_PASS" => ENV['DEFAULT_UDS_PASS'], |
---|
216 | "OGLOG_IP" => ENV['OGLOG_IP'], |
---|
217 | "OGSERVER_IP" => ENV['OGSERVER_IP'], |
---|
218 | } |
---|
219 | app_servers = { |
---|
220 | 'vm1' => { |
---|
221 | :name => "og-#{BRANCH_EXTRA}-server", |
---|
222 | :memsize => SERVERMEM, |
---|
223 | :clone_from => 'template-ubuntu24', |
---|
224 | :networks => [ 'vLan_742', BRANCH_EXTRA ], |
---|
225 | :macs => [ "#{MACPREFIX}:00", "#{MACPREFIX}:01" ], |
---|
226 | :file_provisioner => { |
---|
227 | :src => "installer/vagrant/config/01-eth1.yaml", |
---|
228 | :dst => "/tmp/", |
---|
229 | }, |
---|
230 | :shell_provisioners => [ OGSERVERSCRIPT ], |
---|
231 | }, |
---|
232 | } |
---|
233 | |
---|
234 | vm1_components = vm2_components = [] |
---|
235 | |
---|
236 | if ENV.has_key?("VM1_COMPONENTS") then |
---|
237 | vm1_components = ENV["VM1_COMPONENTS"].split(" ") |
---|
238 | end |
---|
239 | |
---|
240 | if ENV.has_key?("VM2_COMPONENTS") then |
---|
241 | vm2_components = ENV["VM2_COMPONENTS"].split(" ") |
---|
242 | if vm2_components.size > 0 then |
---|
243 | app_servers['vm2'] = { |
---|
244 | :name => "og-#{BRANCH_EXTRA}", |
---|
245 | :memsize => SERVERMEM, |
---|
246 | :clone_from => 'template-ubuntu24', |
---|
247 | :networks => [ 'vLan_742' ], |
---|
248 | :macs => [ "#{MACPREFIX}:02" ], |
---|
249 | :shell_provisioners => [], |
---|
250 | } |
---|
251 | end |
---|
252 | end |
---|
253 | do_debug ("VM1_COMPONENTS: " + vm1_components.to_s) |
---|
254 | do_debug ("VM2_COMPONENTS: " + vm2_components.to_s) |
---|
255 | |
---|
256 | vms_loop = [ |
---|
257 | { "components" => vm1_components, "key" => "vm1" }, |
---|
258 | { "components" => vm2_components, "key" => "vm2" }, |
---|
259 | ] |
---|
260 | all_components = [ |
---|
261 | { "name" => "oglog", "hostname_suffix" => "-log", "script" => OGLOGSCRIPT }, |
---|
262 | { "name" => "ogdhcp", "hostname_suffix" => "-dhcp", "script" => OGDHCPSCRIPT }, |
---|
263 | { "name" => "ogboot", "hostname_suffix" => "-boot", "script" => OGBOOTSCRIPT }, |
---|
264 | { "name" => "ogrepo", "hostname_suffix" => "-repo", "script" => OGREPOSCRIPT }, |
---|
265 | ] |
---|
266 | |
---|
267 | ## foreach VM, foreach OG component: edit hostname and add provisioning script |
---|
268 | vms_loop.each do |vm| |
---|
269 | components = vm['components'] |
---|
270 | key = vm['key'] |
---|
271 | all_components.each do |c| |
---|
272 | if components.include?(c['name']) then |
---|
273 | app_servers[key][:name] += c['hostname_suffix'] |
---|
274 | app_servers[key][:shell_provisioners].push (c['script']) |
---|
275 | end |
---|
276 | end |
---|
277 | end |
---|
278 | |
---|
279 | do_debug (app_servers) |
---|
280 | |
---|
281 | app_servers.each do |machine,data| |
---|
282 | boxname = data[:name] |
---|
283 | config.vm.define boxname do |og| |
---|
284 | og.vm.provider :vmware_esxi do |esxi| |
---|
285 | esxi.guest_name = boxname |
---|
286 | esxi.guest_memsize = data[:memsize] |
---|
287 | esxi.esxi_username = 'root' |
---|
288 | esxi.esxi_password = ESXIPASSWORD |
---|
289 | esxi.esxi_hostname = 'esxi-jenkins.evlt.uma.es' |
---|
290 | esxi.clone_from_vm = data[:clone_from] |
---|
291 | esxi.esxi_resource_pool = "/" |
---|
292 | esxi.local_allow_overwrite = 'True' |
---|
293 | esxi.guest_custom_vmx_settings = [['monitor.allowLegacyCPU', 'TRUE']] |
---|
294 | esxi.guest_storage = [ 10 ] |
---|
295 | esxi.esxi_virtual_network = data[:networks] |
---|
296 | esxi.guest_mac_address = data[:macs] |
---|
297 | esxi.guest_nic_type = 'e1000' |
---|
298 | end |
---|
299 | og.vm.box = "esxi_clone/dummy" |
---|
300 | og.vm.hostname = boxname |
---|
301 | if data.key?(:file_provisioner) |
---|
302 | og.vm.provision "file", source: data[:file_provisioner][:src], destination: data[:file_provisioner][:dst] |
---|
303 | end |
---|
304 | data[:shell_provisioners].each do |script| |
---|
305 | og.vm.provision "shell", inline: script, env: provisioners_env |
---|
306 | end |
---|
307 | end |
---|
308 | end |
---|
309 | end |
---|