Statistics
| Branch: | Tag: | Revision:

root / tools / vcluster-setup.in @ f7f03738

History | View | Annotate | Download (7.6 kB)

1 29386d3e Michael Hanselmann
#!/bin/bash
2 29386d3e Michael Hanselmann
#
3 29386d3e Michael Hanselmann
4 29386d3e Michael Hanselmann
# Copyright (C) 2012 Google Inc.
5 29386d3e Michael Hanselmann
#
6 29386d3e Michael Hanselmann
# This program is free software; you can redistribute it and/or modify
7 29386d3e Michael Hanselmann
# it under the terms of the GNU General Public License as published by
8 29386d3e Michael Hanselmann
# the Free Software Foundation; either version 2 of the License, or
9 29386d3e Michael Hanselmann
# (at your option) any later version.
10 29386d3e Michael Hanselmann
#
11 29386d3e Michael Hanselmann
# This program is distributed in the hope that it will be useful, but
12 29386d3e Michael Hanselmann
# WITHOUT ANY WARRANTY; without even the implied warranty of
13 29386d3e Michael Hanselmann
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 29386d3e Michael Hanselmann
# General Public License for more details.
15 29386d3e Michael Hanselmann
#
16 29386d3e Michael Hanselmann
# You should have received a copy of the GNU General Public License
17 29386d3e Michael Hanselmann
# along with this program; if not, write to the Free Software
18 29386d3e Michael Hanselmann
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 29386d3e Michael Hanselmann
# 02110-1301, USA.
20 29386d3e Michael Hanselmann
21 29386d3e Michael Hanselmann
set -e -u -o pipefail
22 29386d3e Michael Hanselmann
shopt -s extglob
23 29386d3e Michael Hanselmann
24 29386d3e Michael Hanselmann
readonly self=$(readlink -f $0)
25 29386d3e Michael Hanselmann
readonly ensure_dirs=@PKGLIBDIR@/ensure-dirs
26 a6d3644b Michael Hanselmann
readonly action_shortcuts=( start stop restart status watcher )
27 29386d3e Michael Hanselmann
readonly default_nodecount=5
28 29386d3e Michael Hanselmann
readonly default_instcount=10
29 29386d3e Michael Hanselmann
readonly default_netprefix=192.0.2
30 29386d3e Michael Hanselmann
readonly default_netdev=eth0
31 a6d3644b Michael Hanselmann
readonly default_initscript=@SYSCONFDIR@/init.d/ganeti
32 29386d3e Michael Hanselmann
readonly cluster_name=cluster
33 36683bad Michael Hanselmann
readonly etc_hosts_filename=/etc/hosts
34 29386d3e Michael Hanselmann
35 29386d3e Michael Hanselmann
# IP address space:
36 29386d3e Michael Hanselmann
# Cluster: .1
37 29386d3e Michael Hanselmann
# Nodes: .10-.99
38 29386d3e Michael Hanselmann
# Instances: .100-.254
39 29386d3e Michael Hanselmann
readonly first_node_ipaddr_octet=10
40 29386d3e Michael Hanselmann
readonly first_inst_ipaddr_octet=100
41 29386d3e Michael Hanselmann
42 29386d3e Michael Hanselmann
readonly max_node_count=$((first_inst_ipaddr_octet - first_node_ipaddr_octet))
43 29386d3e Michael Hanselmann
readonly max_instance_count=$((255 - first_inst_ipaddr_octet))
44 29386d3e Michael Hanselmann
45 29386d3e Michael Hanselmann
usage() {
46 1266a29b Michael Hanselmann
  echo "Usage: $0 [-E] [-N] [-c <number>] [-i <number>] [-p <prefix>]"\
47 a6d3644b Michael Hanselmann
       '[-n <netdev>] [-I <path>] <directory>'
48 29386d3e Michael Hanselmann
  echo
49 29386d3e Michael Hanselmann
  echo 'Options:'
50 29386d3e Michael Hanselmann
  echo "  -c  Number of virtual nodes (defaults to $default_nodecount)"
51 29386d3e Michael Hanselmann
  echo "  -i  Number of instances (defaults to $default_instcount)"
52 29386d3e Michael Hanselmann
  echo "  -p  IPv4 network prefix (defaults to $default_netprefix)"
53 29386d3e Michael Hanselmann
  echo '  -n  Network device for virtual IP addresses (defaults to'\
54 29386d3e Michael Hanselmann
       "$default_netdev)"
55 a6d3644b Michael Hanselmann
  echo "  -I  Path to init script (defaults to $default_initscript)"
56 36683bad Michael Hanselmann
  echo "  -E  Do not modify $etc_hosts_filename"
57 1266a29b Michael Hanselmann
  echo '  -N  Do not configure networking'
58 29386d3e Michael Hanselmann
}
59 29386d3e Michael Hanselmann
60 29386d3e Michael Hanselmann
# Variables for options
61 29386d3e Michael Hanselmann
nodecount=$default_nodecount
62 29386d3e Michael Hanselmann
instcount=$default_instcount
63 29386d3e Michael Hanselmann
netprefix=$default_netprefix
64 29386d3e Michael Hanselmann
netdev=$default_netdev
65 a6d3644b Michael Hanselmann
initscript=$default_initscript
66 1266a29b Michael Hanselmann
etchosts=1
67 1266a29b Michael Hanselmann
networking=1
68 29386d3e Michael Hanselmann
69 29386d3e Michael Hanselmann
# Parse options
70 a6d3644b Michael Hanselmann
while getopts :hENc:p:n:i:I: opt; do
71 29386d3e Michael Hanselmann
  case "$opt" in
72 29386d3e Michael Hanselmann
    h)
73 29386d3e Michael Hanselmann
      usage
74 29386d3e Michael Hanselmann
      exit 0
75 29386d3e Michael Hanselmann
    ;;
76 29386d3e Michael Hanselmann
    c)
77 29386d3e Michael Hanselmann
      nodecount="$OPTARG"
78 29386d3e Michael Hanselmann
      if [[ "$nodecount" != +([0-9]) ]]; then
79 29386d3e Michael Hanselmann
        echo "Invalid node count number: $nodecount" >&2
80 29386d3e Michael Hanselmann
        exit 1
81 29386d3e Michael Hanselmann
      elif (( nodecount > max_node_count )); then
82 29386d3e Michael Hanselmann
        echo "Node count must be $max_node_count or lower" >&2
83 29386d3e Michael Hanselmann
        exit 1
84 29386d3e Michael Hanselmann
      fi
85 29386d3e Michael Hanselmann
    ;;
86 29386d3e Michael Hanselmann
    i)
87 29386d3e Michael Hanselmann
      instcount="$OPTARG"
88 29386d3e Michael Hanselmann
      if [[ "$instcount" != +([0-9]) ]]; then
89 29386d3e Michael Hanselmann
        echo "Invalid instance count number: $instcount" >&2
90 29386d3e Michael Hanselmann
        exit 1
91 29386d3e Michael Hanselmann
      elif (( instcount > max_instance_count )); then
92 29386d3e Michael Hanselmann
        echo "Instance count must be $max_instance_count or lower" >&2
93 29386d3e Michael Hanselmann
        exit 1
94 29386d3e Michael Hanselmann
      fi
95 29386d3e Michael Hanselmann
    ;;
96 29386d3e Michael Hanselmann
    p)
97 29386d3e Michael Hanselmann
      netprefix="$OPTARG"
98 29386d3e Michael Hanselmann
      if [[ "$netprefix" != +([0-9]).+([0-9]).+([0-9]) ]]; then
99 29386d3e Michael Hanselmann
        echo "Invalid network prefix: $netprefix" >&2
100 29386d3e Michael Hanselmann
        exit 1
101 29386d3e Michael Hanselmann
      fi
102 29386d3e Michael Hanselmann
    ;;
103 29386d3e Michael Hanselmann
    n)
104 29386d3e Michael Hanselmann
      netdev="$OPTARG"
105 29386d3e Michael Hanselmann
      if ! ip link show $netdev >/dev/null; then
106 29386d3e Michael Hanselmann
        echo "Invalid network device: $netdev" >&2
107 29386d3e Michael Hanselmann
        exit 1
108 29386d3e Michael Hanselmann
      fi
109 29386d3e Michael Hanselmann
    ;;
110 a6d3644b Michael Hanselmann
    I)
111 a6d3644b Michael Hanselmann
      initscript="$OPTARG"
112 a6d3644b Michael Hanselmann
      if [[ ! -x $initscript ]]; then
113 a6d3644b Michael Hanselmann
        echo "Init script '$initscript' is not executable" >&2
114 a6d3644b Michael Hanselmann
        exit 1
115 a6d3644b Michael Hanselmann
      fi
116 a6d3644b Michael Hanselmann
      ;;
117 1266a29b Michael Hanselmann
    E)
118 1266a29b Michael Hanselmann
      etchosts=
119 1266a29b Michael Hanselmann
      ;;
120 1266a29b Michael Hanselmann
    N)
121 1266a29b Michael Hanselmann
      networking=
122 1266a29b Michael Hanselmann
      ;;
123 29386d3e Michael Hanselmann
    \?)
124 29386d3e Michael Hanselmann
      echo "Invalid option: -$OPTARG" >&2
125 29386d3e Michael Hanselmann
      usage >&2
126 29386d3e Michael Hanselmann
      exit 1
127 29386d3e Michael Hanselmann
      ;;
128 29386d3e Michael Hanselmann
    :)
129 29386d3e Michael Hanselmann
      echo "Option -$OPTARG requires an argument" >&2
130 29386d3e Michael Hanselmann
      usage >&2
131 29386d3e Michael Hanselmann
      exit 1
132 29386d3e Michael Hanselmann
      ;;
133 29386d3e Michael Hanselmann
  esac
134 29386d3e Michael Hanselmann
done
135 29386d3e Michael Hanselmann
136 29386d3e Michael Hanselmann
shift $((OPTIND - 1))
137 29386d3e Michael Hanselmann
138 29386d3e Michael Hanselmann
if [[ "$#" != 1 ]]; then
139 29386d3e Michael Hanselmann
  usage
140 29386d3e Michael Hanselmann
  exit 1
141 29386d3e Michael Hanselmann
fi
142 29386d3e Michael Hanselmann
143 29386d3e Michael Hanselmann
readonly rootdir=$1; shift
144 29386d3e Michael Hanselmann
145 29386d3e Michael Hanselmann
if [[ ! -d "$rootdir" ]]; then
146 29386d3e Michael Hanselmann
  echo "Directory '$rootdir' does not exist!" >&2
147 29386d3e Michael Hanselmann
  exit 1
148 29386d3e Michael Hanselmann
fi
149 29386d3e Michael Hanselmann
150 29386d3e Michael Hanselmann
if (( $nodecount < 1 )); then
151 29386d3e Michael Hanselmann
  echo "Must create at least one node, currently requested $nodecount" >&2
152 29386d3e Michael Hanselmann
  exit 1
153 29386d3e Michael Hanselmann
fi
154 29386d3e Michael Hanselmann
155 29386d3e Michael Hanselmann
node_hostname() {
156 29386d3e Michael Hanselmann
  local -r number="$1"
157 29386d3e Michael Hanselmann
158 29386d3e Michael Hanselmann
  echo "node$((number + 1))"
159 29386d3e Michael Hanselmann
}
160 29386d3e Michael Hanselmann
161 29386d3e Michael Hanselmann
instance_hostname() {
162 29386d3e Michael Hanselmann
  local -r number="$1"
163 29386d3e Michael Hanselmann
164 29386d3e Michael Hanselmann
  echo "instance$((number + 1))"
165 29386d3e Michael Hanselmann
}
166 29386d3e Michael Hanselmann
167 29386d3e Michael Hanselmann
node_ipaddr() {
168 29386d3e Michael Hanselmann
  local -r number="$1"
169 29386d3e Michael Hanselmann
170 29386d3e Michael Hanselmann
  echo "$netprefix.$((first_node_ipaddr_octet + number))"
171 29386d3e Michael Hanselmann
}
172 29386d3e Michael Hanselmann
173 29386d3e Michael Hanselmann
instance_ipaddr() {
174 29386d3e Michael Hanselmann
  local -r number="$1"
175 29386d3e Michael Hanselmann
176 29386d3e Michael Hanselmann
  echo "$netprefix.$((first_inst_ipaddr_octet + number))"
177 29386d3e Michael Hanselmann
}
178 29386d3e Michael Hanselmann
179 29386d3e Michael Hanselmann
setup_node() {
180 29386d3e Michael Hanselmann
  local -r number="$1"
181 29386d3e Michael Hanselmann
  local -r nodedir=$rootdir/$(node_hostname $number)
182 29386d3e Michael Hanselmann
183 29386d3e Michael Hanselmann
  echo "Setting up node '$(node_hostname $number)' ..." >&2
184 29386d3e Michael Hanselmann
185 29386d3e Michael Hanselmann
  if [[ ! -d $nodedir ]]; then
186 29386d3e Michael Hanselmann
    mkdir $nodedir
187 29386d3e Michael Hanselmann
  fi
188 29386d3e Michael Hanselmann
189 29386d3e Michael Hanselmann
  mkdir -p \
190 6bf7dad4 Michael Hanselmann
    $nodedir@SYSCONFDIR@/{default,ganeti} \
191 1266a29b Michael Hanselmann
    $nodedir@LOCALSTATEDIR@/lock\
192 1266a29b Michael Hanselmann
    $nodedir@LOCALSTATEDIR@/{lib,log,run}/ganeti
193 29386d3e Michael Hanselmann
194 29386d3e Michael Hanselmann
  GANETI_HOSTNAME=$(node_hostname $number) \
195 29386d3e Michael Hanselmann
  GANETI_ROOTDIR=$nodedir \
196 29386d3e Michael Hanselmann
  $ensure_dirs
197 29386d3e Michael Hanselmann
198 29386d3e Michael Hanselmann
  local -r daemon_args="-b $(node_ipaddr $number)"
199 29386d3e Michael Hanselmann
200 29386d3e Michael Hanselmann
  cat > $nodedir/etc/default/ganeti <<EOF
201 29386d3e Michael Hanselmann
# Default settings for virtual node $i
202 29386d3e Michael Hanselmann
NODED_ARGS='--no-mlock $daemon_args'
203 29386d3e Michael Hanselmann
MASTERD_ARGS=''
204 29386d3e Michael Hanselmann
RAPI_ARGS='$daemon_args'
205 29386d3e Michael Hanselmann
CONFD_ARGS='$daemon_args'
206 29386d3e Michael Hanselmann
207 29386d3e Michael Hanselmann
export GANETI_ROOTDIR='$nodedir'
208 29386d3e Michael Hanselmann
export GANETI_HOSTNAME='$(node_hostname $number)'
209 29386d3e Michael Hanselmann
EOF
210 29386d3e Michael Hanselmann
211 29386d3e Michael Hanselmann
  cat > $nodedir/cmd <<EOF
212 29386d3e Michael Hanselmann
#!/bin/bash
213 29386d3e Michael Hanselmann
214 29386d3e Michael Hanselmann
export GANETI_ROOTDIR='$nodedir'
215 29386d3e Michael Hanselmann
export GANETI_HOSTNAME='$(node_hostname $number)'
216 29386d3e Michael Hanselmann
217 29386d3e Michael Hanselmann
bash -c "\$*"
218 29386d3e Michael Hanselmann
EOF
219 29386d3e Michael Hanselmann
  chmod +x $nodedir/cmd
220 29386d3e Michael Hanselmann
}
221 29386d3e Michael Hanselmann
222 29386d3e Michael Hanselmann
setup_all_nodes() {
223 29386d3e Michael Hanselmann
  for ((i=0; i < nodecount; ++i)); do
224 29386d3e Michael Hanselmann
    setup_node $i
225 29386d3e Michael Hanselmann
  done
226 29386d3e Michael Hanselmann
}
227 29386d3e Michael Hanselmann
228 29386d3e Michael Hanselmann
setup_etc_hosts() {
229 36683bad Michael Hanselmann
  echo "Configuring $etc_hosts_filename ..." >&2
230 29386d3e Michael Hanselmann
  (
231 29386d3e Michael Hanselmann
    set -e -u
232 36683bad Michael Hanselmann
    local -r tmpfile=$(mktemp $etc_hosts_filename.vcluster.XXXXX)
233 29386d3e Michael Hanselmann
    trap "rm -f $tmpfile" EXIT
234 29386d3e Michael Hanselmann
    {
235 36683bad Michael Hanselmann
      egrep -v "^$netprefix.[[:digit:]]+[[:space:]]" $etc_hosts_filename
236 29386d3e Michael Hanselmann
      echo "$netprefix.1 $cluster_name"
237 29386d3e Michael Hanselmann
      for ((i=0; i < nodecount; ++i)); do
238 29386d3e Michael Hanselmann
        echo "$(node_ipaddr $i) $(node_hostname $i)"
239 29386d3e Michael Hanselmann
      done
240 29386d3e Michael Hanselmann
      for ((i=0; i < instcount; ++i)); do
241 29386d3e Michael Hanselmann
        echo "$(instance_ipaddr $i) $(instance_hostname $i)"
242 29386d3e Michael Hanselmann
      done
243 29386d3e Michael Hanselmann
    } > $tmpfile && \
244 29386d3e Michael Hanselmann
    chmod 0644 $tmpfile && \
245 36683bad Michael Hanselmann
    mv $tmpfile $etc_hosts_filename && \
246 29386d3e Michael Hanselmann
    trap - EXIT
247 29386d3e Michael Hanselmann
  )
248 29386d3e Michael Hanselmann
}
249 29386d3e Michael Hanselmann
250 29386d3e Michael Hanselmann
setup_network_interfaces() {
251 29386d3e Michael Hanselmann
  echo 'Configuring network ...' >&2
252 29386d3e Michael Hanselmann
  for ((i=0; i < nodecount; ++i)); do
253 29386d3e Michael Hanselmann
    local ipaddr="$(node_ipaddr $i)/32"
254 29386d3e Michael Hanselmann
    ip addr del "$ipaddr" dev "$netdev" || :
255 29386d3e Michael Hanselmann
    ip addr add "$ipaddr" dev "$netdev"
256 29386d3e Michael Hanselmann
  done
257 29386d3e Michael Hanselmann
}
258 29386d3e Michael Hanselmann
259 29386d3e Michael Hanselmann
setup_scripts() {
260 29386d3e Michael Hanselmann
  echo 'Configuring helper scripts ...' >&2
261 29386d3e Michael Hanselmann
  for action in "${action_shortcuts[@]}"; do
262 29386d3e Michael Hanselmann
    {
263 29386d3e Michael Hanselmann
      echo '#!/bin/bash'
264 29386d3e Michael Hanselmann
      for ((i=0; i < nodecount; ++i)); do
265 29386d3e Michael Hanselmann
        local name=$(node_hostname $i)
266 a6d3644b Michael Hanselmann
        if [[ $action = watcher ]]; then
267 a6d3644b Michael Hanselmann
          echo "echo 'Running watcher for virtual node \"$name\" ..."
268 a6d3644b Michael Hanselmann
          echo "$name/cmd ganeti-watcher \"\$@\""
269 a6d3644b Michael Hanselmann
        else
270 a6d3644b Michael Hanselmann
          echo "echo 'Action \"$action\" for virtual node \"$name\" ...'"
271 a6d3644b Michael Hanselmann
          echo "$name/cmd $initscript $action \"\$@\""
272 a6d3644b Michael Hanselmann
        fi
273 29386d3e Michael Hanselmann
      done
274 29386d3e Michael Hanselmann
    } > $rootdir/$action-all
275 29386d3e Michael Hanselmann
    chmod +x $rootdir/$action-all
276 29386d3e Michael Hanselmann
  done
277 29386d3e Michael Hanselmann
}
278 29386d3e Michael Hanselmann
279 29386d3e Michael Hanselmann
show_info() {
280 29386d3e Michael Hanselmann
  cat <<EOF
281 29386d3e Michael Hanselmann
Virtual cluster setup is complete.
282 29386d3e Michael Hanselmann
283 29386d3e Michael Hanselmann
Root directory: $rootdir
284 29386d3e Michael Hanselmann
Cluster name: $cluster_name
285 29386d3e Michael Hanselmann
EOF
286 29386d3e Michael Hanselmann
287 29386d3e Michael Hanselmann
  echo 'Nodes:' $(for ((i=0; i < nodecount; ++i)); do node_hostname $i; done)
288 29386d3e Michael Hanselmann
289 29386d3e Michael Hanselmann
  cat <<EOF
290 29386d3e Michael Hanselmann
291 29386d3e Michael Hanselmann
Initialize cluster:
292 1266a29b Michael Hanselmann
  cd $rootdir && node1/cmd gnt-cluster init --no-etc-hosts \\
293 1266a29b Michael Hanselmann
    --no-ssh-init --no-lvm-storage --no-drbd-storage $cluster_name
294 29386d3e Michael Hanselmann
295 29386d3e Michael Hanselmann
Change cluster settings:
296 29386d3e Michael Hanselmann
  cd $rootdir && node1/cmd gnt-cluster modify \\
297 1266a29b Michael Hanselmann
    --enabled-hypervisors=fake --specs-nic-count=min=0 \\
298 29386d3e Michael Hanselmann
    --specs-disk-size=min=0 --specs-disk-count=min=0
299 29386d3e Michael Hanselmann
300 29386d3e Michael Hanselmann
Add node:
301 29386d3e Michael Hanselmann
  cd $rootdir && node1/cmd gnt-node add --no-ssh-key-check node2
302 29386d3e Michael Hanselmann
EOF
303 29386d3e Michael Hanselmann
}
304 29386d3e Michael Hanselmann
305 29386d3e Michael Hanselmann
setup_all_nodes
306 1266a29b Michael Hanselmann
if [[ -n "$etchosts" ]]; then
307 1266a29b Michael Hanselmann
  setup_etc_hosts
308 1266a29b Michael Hanselmann
fi
309 1266a29b Michael Hanselmann
if [[ -n "$networking" ]]; then
310 1266a29b Michael Hanselmann
  setup_network_interfaces
311 1266a29b Michael Hanselmann
fi
312 29386d3e Michael Hanselmann
setup_scripts
313 29386d3e Michael Hanselmann
show_info
314 29386d3e Michael Hanselmann
315 29386d3e Michael Hanselmann
exit 0
316 29386d3e Michael Hanselmann
317 29386d3e Michael Hanselmann
# vim: set sw=2 sts=2 et :