pkvlm-create
changeset 18 65301be81959
parent 16 d74646c0b5dd
child 20 ee16d147a06c
equal deleted inserted replaced
17:b120db777a60 18:65301be81959
   134 define_opt  disk_lv     $opt_name
   134 define_opt  disk_lv     $opt_name
   135 define_opt  disk_bus    virtio
   135 define_opt  disk_bus    virtio
   136 define_opt  guest_disk  /dev/vda
   136 define_opt  guest_disk  /dev/vda
   137 define_opt  hostname    $opt_name
   137 define_opt  hostname    $opt_name
   138 define_opt  bridge      br-lan
   138 define_opt  bridge      br-lan
   139 define_opt  dns_domain  paivola.fi
   139 define_opt  domain      paivola.fi
   140 define_opt  ip          
   140 define_opt  ip          
   141 define_opt  puppet      
   141 define_opt  puppet      
   142 define_opt  puppet_master   puppet
   142 define_opt  puppet_master   puppet
   143 define_opt  serial_console
   143 define_opt  serial_console
   144 
   144 
   153     define_opt ${name} "${value}"
   153     define_opt ${name} "${value}"
   154 done
   154 done
   155 
   155 
   156 # resolve defaults
   156 # resolve defaults
   157 if [ -z $opt_ip ]; then
   157 if [ -z $opt_ip ]; then
   158     define_opt  ip          $(resolve_name ${opt_name}.${opt_dns_domain})
   158     define_opt  ip          $(resolve_name ${opt_name}.${opt_domain})
   159 fi
   159 fi
   160 
   160 
   161 ### Virtual machine config
   161 ### Virtual machine config
       
   162 ## General
       
   163 NAME=$opt_name
       
   164 DOMAIN=$opt_domain
       
   165 FQDN=${NAME}.${DOMAIN}
       
   166 
   162 ## libvirt guest info
   167 ## libvirt guest info
   163 # Name
   168 # Name
   164 GUEST_NAME=$opt_name
   169 GUEST_NAME=$NAME
   165 
   170 
   166 # Basic params
   171 # Basic params
   167 GUEST_RAM=$opt_ram
   172 GUEST_RAM=$opt_ram
   168 GUEST_VCPUS=$opt_cpus
   173 GUEST_VCPUS=$opt_cpus
   169 
   174 
   196 ### Preseed content
   201 ### Preseed content
   197 GUEST_DISK=$opt_guest_disk
   202 GUEST_DISK=$opt_guest_disk
   198 
   203 
   199 ## Network
   204 ## Network
   200 # Network configuration, for /etc/network/interfaces
   205 # Network configuration, for /etc/network/interfaces
   201 NET_DOMAIN=paivola.fi
   206 NET_DOMAIN=${DOMAIN}
   202 NET_HOSTNAME=$opt_hostname
   207 NET_HOSTNAME=${NAME}
   203 NET_BRIDGE=$opt_bridge
   208 NET_BRIDGE=$opt_bridge
   204 NET_IPADDR=$opt_ip
   209 NET_IPADDR=$opt_ip
   205 NET_NETMASK=255.255.255.0
   210 NET_NETMASK=255.255.255.0
   206 NET_GATEWAY=194.197.235.1
   211 NET_GATEWAY=194.197.235.1
   207 NET_NAMESERVERS=( 194.197.235.210 194.197.235.252 )
   212 NET_NAMESERVERS=( 194.197.235.210 194.197.235.252 )
   244 USER_NAME=$USER
   249 USER_NAME=$USER
   245 USER_FULLNAME=$(user_fullname $USER)
   250 USER_FULLNAME=$(user_fullname $USER)
   246 USER_SHADOW=$(user_shadow $USER)
   251 USER_SHADOW=$(user_shadow $USER)
   247 USER_GROUPS=( cdrom sudo adm )
   252 USER_GROUPS=( cdrom sudo adm )
   248 
   253 
   249 ## Misc
       
   250 PACKAGE_INCLUDES=( sudo screen vim )
       
   251 PRESEED_LATE_COMMANDS=( )
       
   252 PRESEED_LATE_COMMANDS_END=( )
       
   253 PRESEED_INCLUDES=( 'passwords.cfg' 'host.cfg' )
       
   254 
       
   255 function preseed_late_commands () {
       
   256     PRESEED_LATE_COMMANDS=( "${PRESEED_LATE_COMMANDS[@]:-}" "$@" )
       
   257 }
       
   258 
       
   259 # XXX: ordering?
       
   260 function preseed_late_commands_end () {
       
   261     PRESEED_LATE_COMMANDS_END=( "${PRESEED_LATE_COMMANDS_END[@]:-}" "$@" )
       
   262 }
       
   263 
       
   264 
       
   265 ### Extra
       
   266 ## Puppet
       
   267 if [ $opt_puppet ]; then
       
   268     log_info "Puppetizing preseed"
       
   269 
       
   270     PUPPET_PACKAGES=( puppet )
       
   271     PUPPET_COMMANDS=( \
       
   272 #        "in-target sed -i 's/START=no/START=yes/' /etc/default/puppet"  \
       
   273 #        "echo '[agent]\nserver = ${opt_puppet_master}\n' >> /etc/puppet/puppet.conf" \
       
   274     )
       
   275 
       
   276     # XXX: we use files in preseed/files/..., should modularize those
       
   277 
       
   278     PUPPET_MASTER="${opt_puppet_master}"
       
   279 
       
   280     PACKAGE_INCLUDES=( ${PACKAGE_INCLUDES[@]} ${PUPPET_PACKAGES[@]} )
       
   281 
       
   282     [ "${PUPPET_COMMANDS[@]:-}" ] && preseed_late_commands "${PUPPET_COMMANDS[@]}"
       
   283 fi
       
   284 
       
   285 ## Configure GRUB, via preseed/files: /etc/default/grub 
       
   286 # Kernel commandline/grub terminal
       
   287 # The last console=... for kernel is used as /dev/console, i.e. init output
       
   288 
       
   289 if [ $SERIAL_CONSOLE ]; then
       
   290     BOOT_KERNEL_CONSOLE="console=${SERIAL_CONSOLE} console=tty0"
       
   291     BOOT_GRUB_TERMINAL="console serial"
       
   292 
       
   293     # re-generate grub.cfg
       
   294     preseed_late_commands_end "in-target update-grub"
       
   295 
       
   296     # Configure /etc/inittab for serial console
       
   297     preseed_late_commands "in-target sed -i 's/#T0/T0/' /etc/inittab"
       
   298 else
       
   299     BOOT_KERNEL_CONSOLE=""
       
   300     BOOT_GRUB_TERMINAL="console"
       
   301 fi
       
   302 
       
   303 # Kernel boot args (overrides those generated by installer) - default boot option uses args + args_default
       
   304 BOOT_KERNEL_ARGS_DEFAULT="quiet"
       
   305 BOOT_KERNEL_ARGS="${BOOT_KERNEL_CONSOLE}"
       
   306 
       
   307 
       
   308 ### Installer setup
   254 ### Installer setup
   309 ## Installation image
   255 ## Installation image
   310 # Original Debian Installer image (iso)
   256 # Original Debian Installer image (iso)
   311 INSTALLER_NAME="debian-6.0.3-amd64"
   257 INSTALLER_NAME="debian-6.0.3-amd64"
   312 INSTALLER_ISO="iso-in/${INSTALLER_NAME}-netinst.iso"
   258 INSTALLER_ISO="iso-in/${INSTALLER_NAME}-netinst.iso"
   318 
   264 
   319 # Customized image content
   265 # Customized image content
   320 INSTALL_TREE="images/${INSTALL_NAME}"
   266 INSTALL_TREE="images/${INSTALL_NAME}"
   321 INSTALL_ISO="iso-out/${INSTALL_NAME}.iso"
   267 INSTALL_ISO="iso-out/${INSTALL_NAME}.iso"
   322 
   268 
   323 ## Preseed files
   269 
       
   270 ### Preseed setup
       
   271 ## preseed.cfg templating
       
   272 PRESEED_SOURCE_DIR="preseed"
       
   273 
   324 # Preseed output file in install tree
   274 # Preseed output file in install tree
   325 PRESEED_NAME="preseed.cfg"
   275 PRESEED_NAME="preseed.cfg"
   326 
       
   327 # Directory containing our source templates
       
   328 PRESEED_SOURCE_DIR="preseed"
       
   329 
   276 
   330 # Mount path of preseed target in installer
   277 # Mount path of preseed target in installer
   331 PRESEED_MOUNT="/cdrom"
   278 PRESEED_MOUNT="/cdrom"
   332 
   279 
   333 # Prefix for target files in install tree
   280 # Prefix for target files in install tree
   341 PRESEED_FILE="${INSTALL_TREE}/${PRESEED_NAME}"
   288 PRESEED_FILE="${INSTALL_TREE}/${PRESEED_NAME}"
   342 
   289 
   343 # Checksum of target preseed.cfg
   290 # Checksum of target preseed.cfg
   344 PRESEED_CHECKSUM= # set later
   291 PRESEED_CHECKSUM= # set later
   345 
   292 
   346 ## Configs
   293 
   347 
   294 ## preseed.cfg contents
       
   295 # List of additional packages to install
       
   296 PRESEED_PACKAGES=( sudo screen vim )
       
   297 
       
   298 # Script commands to execute
       
   299 PRESEED_LATE_COMMANDS=( )
       
   300 PRESEED_LATE_COMMANDS_END=( )
       
   301 
       
   302 # Chainload preseed files
       
   303 PRESEED_INCLUDES=( 'passwords.cfg' 'host.cfg' )
       
   304 
       
   305 # Add packages to preseed install
       
   306 function preseed_packages () {
       
   307     PRESEED_PACKAGES=( ${PRESEED_PACKAGES[@]} "$@" )
       
   308 }
       
   309 
       
   310 # Add command to execute
       
   311 function preseed_late_commands () {
       
   312     PRESEED_LATE_COMMANDS=( "${PRESEED_LATE_COMMANDS[@]:-}" "$@" )
       
   313 }
       
   314 
       
   315 # Add command to execute at end
       
   316 # XXX: ordering?
       
   317 function preseed_late_commands_end () {
       
   318     PRESEED_LATE_COMMANDS_END=( "${PRESEED_LATE_COMMANDS_END[@]:-}" "$@" )
       
   319 }
       
   320 
       
   321 
       
   322 ## preseed-files
   348 # template source
   323 # template source
   349 CONF_FILES_SOURCE='preseed/files'
   324 CONF_FILES_SOURCE='preseed/files'
   350 
   325 
   351 # template output into install tree
   326 # template output into install tree
   352 CONF_FILES_TARGET_NAME='preseed-files'
   327 CONF_FILES_TARGET_NAME='preseed-files'
   353 CONF_FILES_TARGET="${INSTALL_TREE}/${CONF_FILES_TARGET_NAME}"
   328 CONF_FILES_TARGET="${INSTALL_TREE}/${CONF_FILES_TARGET_NAME}"
   354 
   329 
   355 # paths within installer runtime
   330 # paths within installer runtime
   356 CONF_FILES_CP_SRC="${PRESEED_MOUNT}/${CONF_FILES_TARGET_NAME}"
   331 CONF_FILES_CP_SRC="${PRESEED_MOUNT}/${CONF_FILES_TARGET_NAME}"
   357 CONF_FILES_CP_DST='/target'
   332 CONF_FILES_CP_DST='/target'
       
   333 
       
   334 # Add a file to install in preseed, without templating
       
   335 # preseed_file <src> <dst>/
       
   336 #   if dst is a dir, it must end in /
       
   337 function preseed_file () {
       
   338     local src=$1
       
   339     local dst=$2
       
   340     local dir=$(dirname $dst)
       
   341     local tgt=${CONF_FILES_TARGET}
       
   342 
       
   343     local tgt_dir="$tgt/$dir"
       
   344 
       
   345     if [ ! -d "$tgt_dir" ]; then
       
   346         cmd mkdir -p "$tgt_dir"
       
   347     fi
       
   348 
       
   349     cmd cp "$src" "$tgt/$dst"
       
   350 }
       
   351 
       
   352 ### Extra
       
   353 ## Puppet
       
   354 PUPPET=
       
   355 
       
   356 if [ $opt_puppet ]; then
       
   357     log_info "Puppetizing preseed"
       
   358     PUPPET=yes
       
   359 
       
   360     # install package
       
   361     preseed_packages puppet
       
   362 
       
   363     ## Vars for preseed-files
       
   364     # hostname for puppetmaster (server)
       
   365     PUPPET_MASTER="${opt_puppet_master}"
       
   366 
       
   367     # path ssl data (ssldir)
       
   368     PUPPET_SSLDIR=/etc/puppet/ssl
       
   369 fi
       
   370 
       
   371 # Invoked during image-customizing process
       
   372 function puppet_config () {
       
   373     ## Preseed ssl certs?
       
   374     PUPPET_SOURCE_SSLDIR="${PRESEED_SOURCE_DIR}/puppet/ssl"
       
   375 
       
   376     # copy file to preseed if exists
       
   377     function puppet_preseed_ssl_file () {
       
   378         local name=$1
       
   379 
       
   380         local src=${PUPPET_SOURCE_SSLDIR}/$name
       
   381         local dst=${PUPPET_SSLDIR}/$name
       
   382 
       
   383         if [ -f $src ]; then
       
   384             log_info "puppet: preseed ssl data: $name"
       
   385 
       
   386             cmd preseed_file $src $dst
       
   387         else
       
   388             log_debug "puppet: skip ssl preseed: $name"
       
   389         fi
       
   390     }
       
   391 
       
   392     # ca.pem
       
   393     puppet_preseed_ssl_file certs/ca.pem
       
   394 
       
   395     # guest cert/pkey
       
   396     puppet_preseed_ssl_file certs/${FQDN}.pem
       
   397     puppet_preseed_ssl_file private_keys/${FQDN}.pem
       
   398 }
       
   399 
       
   400 ## Configure GRUB, via preseed/files: /etc/default/grub 
       
   401 # Kernel commandline/grub terminal
       
   402 # The last console=... for kernel is used as /dev/console, i.e. init output
       
   403 
       
   404 if [ $SERIAL_CONSOLE ]; then
       
   405     BOOT_KERNEL_CONSOLE="console=${SERIAL_CONSOLE} console=tty0"
       
   406     BOOT_GRUB_TERMINAL="console serial"
       
   407 
       
   408     # re-generate grub.cfg
       
   409     preseed_late_commands_end "in-target update-grub"
       
   410 
       
   411     # Configure /etc/inittab for serial console
       
   412     preseed_late_commands "in-target sed -i 's/#T0/T0/' /etc/inittab"
       
   413 else
       
   414     BOOT_KERNEL_CONSOLE=""
       
   415     BOOT_GRUB_TERMINAL="console"
       
   416 fi
       
   417 
       
   418 # Kernel boot args (overrides those generated by installer) - default boot option uses args + args_default
       
   419 BOOT_KERNEL_ARGS_DEFAULT="quiet"
       
   420 BOOT_KERNEL_ARGS="${BOOT_KERNEL_CONSOLE}"
       
   421 
       
   422 ### Postprocess preseed
       
   423 ## Preseed files
       
   424 ## Preseed / config files
       
   425 
       
   426 
   358 
   427 
   359 # copy at end of install
   428 # copy at end of install
   360 preseed_late_commands "cp -rd -- ${CONF_FILES_CP_SRC}/* ${CONF_FILES_CP_DST}"
   429 preseed_late_commands "cp -rd -- ${CONF_FILES_CP_SRC}/* ${CONF_FILES_CP_DST}"
   361 
   430 
   362 # Additional files to copy
   431 # Additional files to copy
   485 # Installer exists?
   554 # Installer exists?
   486 if cmd test ! -f ${INSTALLER_ISO}; then
   555 if cmd test ! -f ${INSTALLER_ISO}; then
   487     die "Installer not found: ${INSTALLER_ISO}"
   556     die "Installer not found: ${INSTALLER_ISO}"
   488 fi
   557 fi
   489 
   558 
       
   559 
       
   560 
       
   561 
   490 ### Prepare install
   562 ### Prepare install
   491 ## Extract .iso
   563 ## Extract .iso
   492 if [ -f ${INSTALLER_FLAG} ]; then
   564 if [ -f ${INSTALLER_FLAG} ]; then
   493     log_info "Installer already unpacked: ${INSTALLER_TREE}"
   565     log_info "Installer already unpacked: ${INSTALLER_TREE}"
   494 
   566 
   496     log_info "Unpacking installer: ${INSTALLER_ISO}"
   568     log_info "Unpacking installer: ${INSTALLER_ISO}"
   497     cmd extract_iso ${INSTALLER_ISO} ${INSTALLER_TREE}
   569     cmd extract_iso ${INSTALLER_ISO} ${INSTALLER_TREE}
   498     cmd touch ${INSTALLER_FLAG}
   570     cmd touch ${INSTALLER_FLAG}
   499 fi
   571 fi
   500 
   572 
   501 # Copy to customized tree
   573 ## Copy to customized tree
   502 [ -d ${INSTALL_TREE} ] && cmd rm -r ${INSTALL_TREE}
   574 [ -d ${INSTALL_TREE} ] && cmd rm -r ${INSTALL_TREE}
   503 cmd cp -rd ${INSTALLER_TREE} ${INSTALL_TREE}
   575 cmd cp -rd ${INSTALLER_TREE} ${INSTALL_TREE}
   504 cmd chmod -R u=rwX,og=rX ${INSTALL_TREE}
   576 cmd chmod -R u=rwX,og=rX ${INSTALL_TREE}
   505 
   577 
   506 log_info "Installer extracted: $INSTALL_TREE"
   578 log_info "Installer extracted: $INSTALL_TREE"
   507 
   579 
   508 ## Customize preseed
   580 
       
   581 
       
   582 ### Customize preseed
       
   583 ## preseed.cfg
   509 cmd expand_template ${PRESEED_TEMPLATE} ${PRESEED_FILE}
   584 cmd expand_template ${PRESEED_TEMPLATE} ${PRESEED_FILE}
   510 
   585 
   511 # md5sum
   586 # md5sum
   512 PRESEED_CHECKSUM=$(my_md5sum $PRESEED_FILE)
   587 PRESEED_CHECKSUM=$(my_md5sum $PRESEED_FILE)
   513 
   588 
   514 # Isolinux .cfg
   589 ## Isolinux
   515 cmd expand_template ${PRESEED_ISOLINUX} ${INSTALL_TREE}/isolinux/isolinux.cfg
   590 cmd expand_template ${PRESEED_ISOLINUX} ${INSTALL_TREE}/isolinux/isolinux.cfg
   516 
   591 
   517 # Others
   592 ## Includes
   518 for file in ${PRESEED_INCLUDE_FILES[@]}; do
   593 for file in ${PRESEED_INCLUDE_FILES[@]}; do
   519     name=$(basename $file)
   594     name=$(basename $file)
   520 
   595 
   521     cmd expand_template $file ${INSTALL_TREE}/${name}
   596     cmd expand_template $file ${INSTALL_TREE}/${name}
   522 done
   597 done
   523 
   598 
   524 log_info "Preseed generated: $PRESEED_FILE"
   599 log_info "Preseed generated: $PRESEED_FILE"
   525 
   600 
   526 # Files
   601 ## Config preseed-files
   527 log_info "Copy preseed-files"...
   602 log_info "Copy preseed-files"...
   528 cmd expand_tree ${CONF_FILES_SOURCE} ${CONF_FILES_TARGET}
   603 cmd expand_tree ${CONF_FILES_SOURCE} ${CONF_FILES_TARGET}
   529 
   604 
   530 ## Create .iso
   605 ## Modules
       
   606 # Puppet
       
   607 [ $PUPPET ] && puppet_config
       
   608 
       
   609 
       
   610 
       
   611 
       
   612 
       
   613 ### Create .iso
   531 [ -f ${INSTALL_ISO} ] && cmd rm -f ${INSTALL_ISO}
   614 [ -f ${INSTALL_ISO} ] && cmd rm -f ${INSTALL_ISO}
   532 
   615 
   533 # generates a lot of output
   616 # generates a lot of output
   534 cmd ${GENISOIMAGE} -o ${INSTALL_ISO} -quiet ${GENISOIMAGE_OPTS} ${INSTALL_TREE} 
   617 cmd ${GENISOIMAGE} -o ${INSTALL_ISO} -quiet ${GENISOIMAGE_OPTS} ${INSTALL_TREE} 
   535 
   618 
   536 log_info "Install ISO generated: $INSTALL_ISO"
   619 log_info "Install ISO generated: $INSTALL_ISO"
       
   620 
       
   621 
       
   622 
       
   623 
       
   624 
   537 
   625 
   538 ### Create virtual machine
   626 ### Create virtual machine
   539 if [ $DO_VIRTINSTALL ]; then
   627 if [ $DO_VIRTINSTALL ]; then
   540     ## Check
   628     ## Check
   541     # VM exists?
   629     # VM exists?