puppet: preinstall ca+host ssl certs
authorTero Marttila <terom@fixme.fi>
Mon, 30 Jan 2012 13:15:18 +0200
changeset 18 65301be81959
parent 17 b120db777a60
child 19 b50c8571a067
puppet: preinstall ca+host ssl certs
pkvlm-create
preseed/files/etc/puppet/puppet.conf
preseed/preseed.cfg
--- a/pkvlm-create	Mon Jan 30 13:14:46 2012 +0200
+++ b/pkvlm-create	Mon Jan 30 13:15:18 2012 +0200
@@ -136,7 +136,7 @@
 define_opt  guest_disk  /dev/vda
 define_opt  hostname    $opt_name
 define_opt  bridge      br-lan
-define_opt  dns_domain  paivola.fi
+define_opt  domain      paivola.fi
 define_opt  ip          
 define_opt  puppet      
 define_opt  puppet_master   puppet
@@ -155,13 +155,18 @@
 
 # resolve defaults
 if [ -z $opt_ip ]; then
-    define_opt  ip          $(resolve_name ${opt_name}.${opt_dns_domain})
+    define_opt  ip          $(resolve_name ${opt_name}.${opt_domain})
 fi
 
 ### Virtual machine config
+## General
+NAME=$opt_name
+DOMAIN=$opt_domain
+FQDN=${NAME}.${DOMAIN}
+
 ## libvirt guest info
 # Name
-GUEST_NAME=$opt_name
+GUEST_NAME=$NAME
 
 # Basic params
 GUEST_RAM=$opt_ram
@@ -198,8 +203,8 @@
 
 ## Network
 # Network configuration, for /etc/network/interfaces
-NET_DOMAIN=paivola.fi
-NET_HOSTNAME=$opt_hostname
+NET_DOMAIN=${DOMAIN}
+NET_HOSTNAME=${NAME}
 NET_BRIDGE=$opt_bridge
 NET_IPADDR=$opt_ip
 NET_NETMASK=255.255.255.0
@@ -246,41 +251,151 @@
 USER_SHADOW=$(user_shadow $USER)
 USER_GROUPS=( cdrom sudo adm )
 
-## Misc
-PACKAGE_INCLUDES=( sudo screen vim )
+### Installer setup
+## Installation image
+# Original Debian Installer image (iso)
+INSTALLER_NAME="debian-6.0.3-amd64"
+INSTALLER_ISO="iso-in/${INSTALLER_NAME}-netinst.iso"
+INSTALLER_TREE="iso-in/$INSTALLER_NAME"
+INSTALLER_FLAG="${INSTALLER_TREE}.unpacked"
+
+# Customized preseed image name
+INSTALL_NAME="debian-6.0.3-amd64_${GUEST_NAME}"
+
+# Customized image content
+INSTALL_TREE="images/${INSTALL_NAME}"
+INSTALL_ISO="iso-out/${INSTALL_NAME}.iso"
+
+
+### Preseed setup
+## preseed.cfg templating
+PRESEED_SOURCE_DIR="preseed"
+
+# Preseed output file in install tree
+PRESEED_NAME="preseed.cfg"
+
+# Mount path of preseed target in installer
+PRESEED_MOUNT="/cdrom"
+
+# Prefix for target files in install tree
+# XXX: not implemented
+#PRESEED_TARGET_PREFIX=""
+
+# Main preseed source template
+PRESEED_TEMPLATE="${PRESEED_SOURCE_DIR}/${PRESEED_NAME}"
+
+# Target path for preseed in install tree
+PRESEED_FILE="${INSTALL_TREE}/${PRESEED_NAME}"
+
+# Checksum of target preseed.cfg
+PRESEED_CHECKSUM= # set later
+
+
+## preseed.cfg contents
+# List of additional packages to install
+PRESEED_PACKAGES=( sudo screen vim )
+
+# Script commands to execute
 PRESEED_LATE_COMMANDS=( )
 PRESEED_LATE_COMMANDS_END=( )
+
+# Chainload preseed files
 PRESEED_INCLUDES=( 'passwords.cfg' 'host.cfg' )
 
+# Add packages to preseed install
+function preseed_packages () {
+    PRESEED_PACKAGES=( ${PRESEED_PACKAGES[@]} "$@" )
+}
+
+# Add command to execute
 function preseed_late_commands () {
     PRESEED_LATE_COMMANDS=( "${PRESEED_LATE_COMMANDS[@]:-}" "$@" )
 }
 
+# Add command to execute at end
 # XXX: ordering?
 function preseed_late_commands_end () {
     PRESEED_LATE_COMMANDS_END=( "${PRESEED_LATE_COMMANDS_END[@]:-}" "$@" )
 }
 
 
+## preseed-files
+# template source
+CONF_FILES_SOURCE='preseed/files'
+
+# template output into install tree
+CONF_FILES_TARGET_NAME='preseed-files'
+CONF_FILES_TARGET="${INSTALL_TREE}/${CONF_FILES_TARGET_NAME}"
+
+# paths within installer runtime
+CONF_FILES_CP_SRC="${PRESEED_MOUNT}/${CONF_FILES_TARGET_NAME}"
+CONF_FILES_CP_DST='/target'
+
+# Add a file to install in preseed, without templating
+# preseed_file <src> <dst>/
+#   if dst is a dir, it must end in /
+function preseed_file () {
+    local src=$1
+    local dst=$2
+    local dir=$(dirname $dst)
+    local tgt=${CONF_FILES_TARGET}
+
+    local tgt_dir="$tgt/$dir"
+
+    if [ ! -d "$tgt_dir" ]; then
+        cmd mkdir -p "$tgt_dir"
+    fi
+
+    cmd cp "$src" "$tgt/$dst"
+}
+
 ### Extra
 ## Puppet
+PUPPET=
+
 if [ $opt_puppet ]; then
     log_info "Puppetizing preseed"
+    PUPPET=yes
 
-    PUPPET_PACKAGES=( puppet )
-    PUPPET_COMMANDS=( \
-#        "in-target sed -i 's/START=no/START=yes/' /etc/default/puppet"  \
-#        "echo '[agent]\nserver = ${opt_puppet_master}\n' >> /etc/puppet/puppet.conf" \
-    )
+    # install package
+    preseed_packages puppet
 
-    # XXX: we use files in preseed/files/..., should modularize those
-
+    ## Vars for preseed-files
+    # hostname for puppetmaster (server)
     PUPPET_MASTER="${opt_puppet_master}"
 
-    PACKAGE_INCLUDES=( ${PACKAGE_INCLUDES[@]} ${PUPPET_PACKAGES[@]} )
+    # path ssl data (ssldir)
+    PUPPET_SSLDIR=/etc/puppet/ssl
+fi
 
-    [ "${PUPPET_COMMANDS[@]:-}" ] && preseed_late_commands "${PUPPET_COMMANDS[@]}"
-fi
+# Invoked during image-customizing process
+function puppet_config () {
+    ## Preseed ssl certs?
+    PUPPET_SOURCE_SSLDIR="${PRESEED_SOURCE_DIR}/puppet/ssl"
+
+    # copy file to preseed if exists
+    function puppet_preseed_ssl_file () {
+        local name=$1
+
+        local src=${PUPPET_SOURCE_SSLDIR}/$name
+        local dst=${PUPPET_SSLDIR}/$name
+
+        if [ -f $src ]; then
+            log_info "puppet: preseed ssl data: $name"
+
+            cmd preseed_file $src $dst
+        else
+            log_debug "puppet: skip ssl preseed: $name"
+        fi
+    }
+
+    # ca.pem
+    puppet_preseed_ssl_file certs/ca.pem
+
+    # guest cert/pkey
+    puppet_preseed_ssl_file certs/${FQDN}.pem
+    puppet_preseed_ssl_file private_keys/${FQDN}.pem
+}
 
 ## Configure GRUB, via preseed/files: /etc/default/grub 
 # Kernel commandline/grub terminal
@@ -304,57 +419,11 @@
 BOOT_KERNEL_ARGS_DEFAULT="quiet"
 BOOT_KERNEL_ARGS="${BOOT_KERNEL_CONSOLE}"
 
-
-### Installer setup
-## Installation image
-# Original Debian Installer image (iso)
-INSTALLER_NAME="debian-6.0.3-amd64"
-INSTALLER_ISO="iso-in/${INSTALLER_NAME}-netinst.iso"
-INSTALLER_TREE="iso-in/$INSTALLER_NAME"
-INSTALLER_FLAG="${INSTALLER_TREE}.unpacked"
-
-# Customized preseed image name
-INSTALL_NAME="debian-6.0.3-amd64_${GUEST_NAME}"
-
-# Customized image content
-INSTALL_TREE="images/${INSTALL_NAME}"
-INSTALL_ISO="iso-out/${INSTALL_NAME}.iso"
-
+### Postprocess preseed
 ## Preseed files
-# Preseed output file in install tree
-PRESEED_NAME="preseed.cfg"
-
-# Directory containing our source templates
-PRESEED_SOURCE_DIR="preseed"
+## Preseed / config files
 
-# Mount path of preseed target in installer
-PRESEED_MOUNT="/cdrom"
-
-# Prefix for target files in install tree
-# XXX: not implemented
-#PRESEED_TARGET_PREFIX=""
-
-# Main preseed source template
-PRESEED_TEMPLATE="${PRESEED_SOURCE_DIR}/${PRESEED_NAME}"
-
-# Target path for preseed in install tree
-PRESEED_FILE="${INSTALL_TREE}/${PRESEED_NAME}"
 
-# Checksum of target preseed.cfg
-PRESEED_CHECKSUM= # set later
-
-## Configs
-
-# template source
-CONF_FILES_SOURCE='preseed/files'
-
-# template output into install tree
-CONF_FILES_TARGET_NAME='preseed-files'
-CONF_FILES_TARGET="${INSTALL_TREE}/${CONF_FILES_TARGET_NAME}"
-
-# paths within installer runtime
-CONF_FILES_CP_SRC="${PRESEED_MOUNT}/${CONF_FILES_TARGET_NAME}"
-CONF_FILES_CP_DST='/target'
 
 # copy at end of install
 preseed_late_commands "cp -rd -- ${CONF_FILES_CP_SRC}/* ${CONF_FILES_CP_DST}"
@@ -487,6 +556,9 @@
     die "Installer not found: ${INSTALLER_ISO}"
 fi
 
+
+
+
 ### Prepare install
 ## Extract .iso
 if [ -f ${INSTALLER_FLAG} ]; then
@@ -498,23 +570,26 @@
     cmd touch ${INSTALLER_FLAG}
 fi
 
-# Copy to customized tree
+## Copy to customized tree
 [ -d ${INSTALL_TREE} ] && cmd rm -r ${INSTALL_TREE}
 cmd cp -rd ${INSTALLER_TREE} ${INSTALL_TREE}
 cmd chmod -R u=rwX,og=rX ${INSTALL_TREE}
 
 log_info "Installer extracted: $INSTALL_TREE"
 
-## Customize preseed
+
+
+### Customize preseed
+## preseed.cfg
 cmd expand_template ${PRESEED_TEMPLATE} ${PRESEED_FILE}
 
 # md5sum
 PRESEED_CHECKSUM=$(my_md5sum $PRESEED_FILE)
 
-# Isolinux .cfg
+## Isolinux
 cmd expand_template ${PRESEED_ISOLINUX} ${INSTALL_TREE}/isolinux/isolinux.cfg
 
-# Others
+## Includes
 for file in ${PRESEED_INCLUDE_FILES[@]}; do
     name=$(basename $file)
 
@@ -523,11 +598,19 @@
 
 log_info "Preseed generated: $PRESEED_FILE"
 
-# Files
+## Config preseed-files
 log_info "Copy preseed-files"...
 cmd expand_tree ${CONF_FILES_SOURCE} ${CONF_FILES_TARGET}
 
-## Create .iso
+## Modules
+# Puppet
+[ $PUPPET ] && puppet_config
+
+
+
+
+
+### Create .iso
 [ -f ${INSTALL_ISO} ] && cmd rm -f ${INSTALL_ISO}
 
 # generates a lot of output
@@ -535,6 +618,11 @@
 
 log_info "Install ISO generated: $INSTALL_ISO"
 
+
+
+
+
+
 ### Create virtual machine
 if [ $DO_VIRTINSTALL ]; then
     ## Check
--- a/preseed/files/etc/puppet/puppet.conf	Mon Jan 30 13:14:46 2012 +0200
+++ b/preseed/files/etc/puppet/puppet.conf	Mon Jan 30 13:15:18 2012 +0200
@@ -1,7 +1,7 @@
 [main]
 logdir=/var/log/puppet
 vardir=/var/lib/puppet
-ssldir=/var/lib/puppet/ssl
+ssldir={PUPPET_SSLDIR}
 rundir=/var/run/puppet
 factpath=$vardir/lib/facter
 templatedir=$confdir/templates
--- a/preseed/preseed.cfg	Mon Jan 30 13:14:46 2012 +0200
+++ b/preseed/preseed.cfg	Mon Jan 30 13:15:18 2012 +0200
@@ -319,7 +319,7 @@
 
 # Individual additional packages to install
 d-i pkgsel/include              string \
-    {PACKAGE_INCLUDES[*]}
+    {PRESEED_PACKAGES[*]}
 
 
 # Whether to upgrade packages after debootstrap.