---
title: Debian Preseeded install medium
date: 2016-08-02 09:00:00
---

After the configuration of my servers through Saltstack, I decided to
go furter and to also store the configuration to my laptops and home computed
into Saltstack and thus allow an easy way to format and get a fully configured
system back in place really easily and quickly.

First step was to get a quick way of formatting my computers without or
with only minimal human intervention. As I'm using Debian, it means preparing
a preseeded installation file so that everything is taken care of.

I tried some approaches to build manually an install image but as I went
along, I decided to scratch all that and script the build of this medium.
I looked around and found existing work by [acatton on GitHub](https://github.com/acatton/debian-preseeded-iso).

There were a number of problems I wanted to fix :

1. The hostname should be provided by the user on build
2. A default user account should be created
2. Or perhaps not and the user would have to input something during the install
3. I wanted an encrypted root partition by default
4. I wanted to install a Saltstack minion by default
5. I needed to copy default configuration files

The encryption and installation of a minion were easy tasks and only need
edition of the preseed file. The other points introduced the need for a
templating script that could generate different files as needed and using
user input during the generation of the medium.

As I already knew the Mustache syntax, I decided to use Mustache as a
templating engine to generate the needed preseed files. Instead of
copying the preseed file from the folder into the generated medium image,
I sent it through `mo` with various variables to get 4 different install
seeds.

    cat "$PRESEED" | SUITE="jessie"  TARGETNAME=$HOSTNAME CREATEUSER=1 ./mo > "$TMP/preseed-jessie-autouser.cfg"
    cat "$PRESEED" | SUITE="stretch" TARGETNAME=$HOSTNAME CREATEUSER=1 ./mo > "$TMP/preseed-stretch-autouser.cfg"
    
    unset CREATEUSER
    
    cat "$PRESEED" | SUITE="jessie"  TARGETNAME=$HOSTNAME              ./mo > "$TMP/preseed-jessie-manualuser.cfg"
    cat "$PRESEED" | SUITE="stretch" TARGETNAME=$HOSTNAME              ./mo > "$TMP/preseed-stretch-manualuser.cfg"

And then, I changed the `isolinux/txt.cfg` configuration file to get an
entry for each configuration file.

    cat >> isolinux/txt.cfg <<EOE
    label install-jessie-manualuser
    	menu label ^Install Jessie $HOSTNAME (manual user)
    	kernel /install.amd/vmlinuz
    	append vga=788 initrd=/install.amd/initrd.gz auto=true file=/cdrom/preseed-jessie-manualuser.cfg
    EOE
    
    cat >> isolinux/txt.cfg <<EOE
    label install-jessie-autouser
    	menu label ^Install Jessie $HOSTNAME (auto Valdor user)
    	kernel /install.amd/vmlinuz
    	append vga=788 initrd=/install.amd/initrd.gz auto=true file=/cdrom/preseed-jessie-autouser.cfg
    EOE
    
    cat >> isolinux/txt.cfg <<EOE
    label install-stretch-autouser
    	menu label ^Install Stretch $HOSTNAME (manual user)
    	kernel /install.amd/vmlinuz
    	append vga=788 initrd=/install.amd/initrd.gz auto=true file=/cdrom/preseed-stretch-manualuser.cfg
    EOE
    
    cat >> isolinux/txt.cfg <<EOE
    label install-stretch-autouser
    	menu label ^Install Stretch $HOSTNAME (auto Valdor user)
    	kernel /install.amd/vmlinuz
    	append vga=788 initrd=/install.amd/initrd.gz auto=true file=/cdrom/preseed-stretch-autouser.cfg
    EOE

The Saltstack minion is installed by the preseed
`d-i pkgsel/include string salt-minion plymouth plymouth-themes` directive
and with the configuration file also copied at the end of the install
with `d-i preseed/late_command string cp -a /cdrom/preseed/minion /target/etc/salt/`.
The only manual interaction needed is to accept the minion key after the
reboot and let Saltstack up the newly installed computer.
