Kickstart

Kickstart est un utilitaire permettant d'automatiser l'installation d'Ubuntu (et de ses variantes Kubuntu, Xubuntu, …). Il facilite ainsi le déploiement d'un grand nombre de machines en offrant une installation rapide et une configuration personnalisable.

Kickstart est à l'origine le système d'automatisation d'installation de la société RedHat. Le système d'automatisation des distributions Debian et de ses dérivées est Preseed. Réputé plus complexe que Kickstart, ce dernier ne bénéficie pas non plus d'un utilitaire graphique d'aide à la création des fichiers de description. La version de Kickstart présente dans Ubuntu et ses dérivées démultiplie les possibilités en permettant l'utilisation de commandes Preseed.

Le portage de Kickstart sur les distributions de Canonical est incomplet. Des instructions telles que la mise à jour de distribution (prise en charge par apt), l'exclusion de paquets ou la configuration de X sont ainsi ignorées.

Kickstart permet également l'exécution de scripts avant installation, et surtout après installation. Cette fonctionnalité ouvre encore les possibilités de personnalisation du système installé. Les scripts de fin d'installation peuvent être "chrootés" ou non, c'est-à-dire exécutés dans le système nouvellement installé (chroot) ou dans le système temporaire mis en place pour l'installation (nochroot).

Installation

Kickstart est un utilitaire inclus dans le système et ne nécessite pas d'installation. La création du fichier Kickstart (ks) qui pilotera l'installation du système d'exploitation sera la tâche principale de l'utilisateur.

Configuration

Utilitaire de génération de fichier ks

Il existe un petit utilitaire graphique permettant de définir rapidement les paramètres de base d'un fichier Kickstart. Pour cela, vous pouvez installer le paquet system-config-kickstart. Cependant, si cet utilitaire vous permettra de vous familiariser avec le système, il trouvera sans doute rapidement ses limites.

Exemple simple de fichier ks

Voici ce que donne un fichier ks généré avec peu d'options depuis l'utilitaire system-config-kickstart :

#Generated by Kickstart Configurator
#platform=x86

#System language
lang fr_FR
#Language modules to install
langsupport fr_FR
#System keyboard
keyboard fr
#System mouse
mouse
#System timezone
timezone Europe/Paris
#Root password
rootpw --disabled
#Initial user
user test --fullname "" --iscrypted --password $1$us6C7Q/3$asXQAUrZA89Ky.xGINj9K0
#Use text mode install
text
#Install OS instead of upgrade
install
#Use CDROM installation media
cdrom
#System bootloader configuration
bootloader --location=mbr 
#Clear the Master Boot Record
zerombr yes
#Partition clearing information
clearpart --all --initlabel 
#System authorization infomation
auth  --useshadow  --enablemd5 
#Firewall configuration
firewall --disabled 
#Do not configure the X Window System
skipx

Exemple avancé de fichier ks

Voici un exemple de fichier Kickstart un peu plus avancé, faisant notamment appel à des scripts complémentaires :

# Script Kickstart pour installation automatisée
# de (U|Xu|Ku)buntu 10.04 LTS par le réseau
#
# Options d'appel :
#  machine=nom_de_machine (obligatoire)
#    abandon de l'installation si non fourni
#  utilisateur=nom_d_utilisateur (facultatif)
#    = "Utilisateur_par_defaut" si non fourni
#  login=login_utilisateur (facultatif)
#    = $machine si non fourni
#  mdp=mot_de_passe_utilisateur (facultatif)
#    = "temporaire" si non fourni
#  mdp_vino=mot_de_passe_prise_de_controle (facultatif)
#    = $mdp si non fourni
#  distrib=[ubuntu|xubuntu] (facultatif, ubuntu par défaut)
#  aformat=non (facultatif, oui par défaut)
#  reboot=oui (facultatif, non par défaut)
#    redémarrage en fin d'installation si fourni

# Langue à utiliser pour l'installation et le système
lang fr_FR

# Modules de langue à installer
langsupport fr_FR

# Clavier
keyboard fr

# Souris
mouse

# Fuseau horaire
timezone --utc Europe/Paris

# Mot de passe Root (pas de mot de passe pour root par défaut sous Ubuntu)
rootpw --disabled

# Utilisateur de départ - config en section %pre
%include /tmp/user_conf

# Redémarrage après installation si demandé - config en section pre%
%include /tmp/reboot_conf

# Installation en mode texte
text

# Installation de l'OS plutôt que mise à jour
install

# Adresse du dépot local pour installation par le réseau
url --url http://mon_serveur_local/ubuntu/

# Configuration du chargeur de démarrage
bootloader --location=mbr

# Destruction des tables de partitions invalides
zerombr yes

# Supression puis définition des partitions si demandé
%include /tmp/part_conf

# Définition des options d'authentification pour le système
auth  --useshadow  --enablemd5

# Configuration du réseau
%include /tmp/network_conf

# Configuration du pare-feu
firewall --disabled

# Ne pas configurer X pour le système
skipx

# Installation des paquets supplémentaires
%packages --resolvedeps
%include /tmp/paquets_conf

%pre

# Lecture et mise en variables des paramètres d'installation 
set -- `cat /proc/cmdline`
for I in $*; do case "$I" in *=*) eval $I;; esac; done

if [ -z "$machine" ]; then
    echo "Variable 'machine' non renseignée !"
    echo "Abandon de l'installation !"
    echo "Redémarrage dans 5 secondes !"
    sleep 5
    reboot
fi

if [ -z "$utilisateur" ]; then
    utilisateur="Utilisateur_par_defaut"
fi

if [ -z "$login" ]; then
    login=$machine
fi

if [ -z "$mdp" ]; then
    mdp="temporaire"
fi

if [ -z "$mdp_vino" ]; then
    mdp_vino=$mdp
fi

if [ "$distrib" != "xubuntu" ]; then
    distrib="ubuntu"
fi

if [ "$aformat" != "non" ]; then
    aformat="oui"
fi

if [ "$reboot" != "oui" ]; then
    reboot="non"
fi

echo "-------------------------------------------------"
echo "              Résumé d\'installation"
echo "-------------------------------------------------"
echo " "
echo " "
echo "-------------------------------------------------"
echo "    Nom de la machine     = $machine"
echo "    Nom de l\'utilisateur  = $utilisateur"
echo "    Login                 = $login"
echo "    Mot de passe          = $mdp"
echo "    Mot de passe Vino     = $mdp_vino"
echo "    Distribution          = $distrib"
echo "    Formatage automatique = $aformat"
echo "    Reboot après install. = $reboot"
echo "-------------------------------------------------"
echo " "
echo " "
echo "-------------------------------------------------"
echo "    L\'installation écrasera irrémédiablement"
echo "    toutes les données du disque !"
echo " "
echo "    Redémarrer la machine avant 30 secondes"
echo "    pour annuler l'installation !"
echo "--------------------------------------------------"
echo " "
echo " "
echo " "
sleep 30

# Configuration de l'utilisateur
echo "user $login --fullname $utilisateur --password $mdp" > /tmp/user_conf

# Gestion du reboot si demandé
if [ "$reboot" == "oui" ]; then
    echo "reboot" > /tmp/reboot_conf
fi

# Gestion des partitions si demandé
if [ "$aformat" == "oui" ]; then
    cat > /tmp/part_conf << eof
        # Suppression des partitions du système
        clearpart --all --initlabel
        # Définition des partitions
        part swap --size 1024 --fstype swap --asprimary
        part / --size 1024 --fstype ext3 --asprimary --grow
    eof
fi

# Configuration réseau (paramètre '--hostname=" ne fonctionne pas)
echo "network --bootproto dhcp --device=eth0" > /tmp/network_conf

# Configuration des paquets à installer
if [ "$distrib" == "xubuntu" ]; then
    cat > /tmp/paquets_conf << eof
        @ xubuntu-desktop
        bsd-mailx
        cups-pdf
        icedtea6-plugin
        ntp
        numlockx
        ocsinventory-agent
        openoffice.org
        smbfs
        ssh
        ssmtp
        #ttf-mscorefonts-installer
        vino
    eof
else
    cat > /tmp/paquets_conf << eof
        @ ubuntu-desktop
        bsd-mailx
        cups-pdf
        icedtea6-plugin
        ntp
        ocsinventory-agent
        smbfs
        ssh
        ssmtp
        thunderbird-locale-fr
        #ttf-mscorefonts-installer
    eof
fi

%post --nochroot

# Reprise de la définition des variables non renseignées car non conservées
if [ -z "$utilisateur" ]; then
    utilisateur="Utilisateur_par_defaut"
fi

if [ -z "$login" ]; then
    login=$machine
fi

if [ -z "$mdp" ]; then
    mdp="temp"
fi

if [ -z "$mdp_vino" ]; then
    mdp_vino=$mdp
fi

if [ "$distrib" != "xubuntu" ]; then
    distrib="ubuntu"
fi

if [ "$reboot" != "oui" ]; then
    reboot="non"
fi

# Changement de serveur du temps (selon nom de la machine)
case "$machine" in
t1* | t2*)
    sed -i 's/server ntp.ubuntu.com/server mon_serveur_temps_local/g' /target/etc/ntp.conf
    ;;
esac

# Changement du port ssh
sed -i 's/Port 22/Port 1234/g' /target/etc/ssh/sshd_config

# Mise en place de l'auto-login
if [ "$distrib" == "xubuntu" ]; then
    cat > /target/etc/gdm/custom.conf << eof
    [daemon]
    TimedLoginEnable=false
    AutomaticLoginEnable=true
    TimedLogin=$login
    AutomaticLogin=$login
    TimedLoginDelay=30
    DefaultSession=xubuntu
    eof
else
    cat > /target/etc/gdm/custom.conf << eof
    TimedLoginEnable=false
    AutomaticLoginEnable=true
    TimedLogin=$login
    AutomaticLogin=$login
    TimedLoginDelay=30
    DefaultSession=gnome
    eof

fi

# Configuration de ssmtp
cat > /target/etc/ssmtp/ssmtp.conf << eof
    root=admin@mon_domaine.com
    mailhub=mon_serveur_de_mail
    rewriteDomain=mon_domaine.com
    hostname=$machine
    FromLineOverride=YES
eof
cat > /target/etc/ssmtp/revalias << eof
    root:$machine@mon_domaine.com:mon_serveur_de_mail
    admin:$machine@mon_domaine.com:mon_serveur_de_mail
    $machine:$machine@mon_domaine.com:mon_serveur_de_mail
eof

# Suppression des paquets non souhaités
if [ "$distrib" == "xubuntu" ]; then
    chroot /target apt-get -y remove abiword-common
    chroot /target apt-get -y remove gnome-games-common
    chroot /target apt-get -y remove gnumeric-common
    chroot /target apt-get -y remove pidgin-data
    chroot /target apt-get -y remove transmission-common
    chroot /target apt-get -y remove xchat-common
else
    chroot /target apt-get -y remove empathy-common
    chroot /target apt-get -y remove gbrainy
    chroot /target apt-get -y remove gnome-games-common
    chroot /target apt-get -y remove gwibber-service
    chroot /target apt-get -y remove pidgin
    chroot /target apt-get -y remove pitivi
    chroot /target apt-get -y remove transmission-common
fi

# Modification des dépots
# suppression des dépots de sources
sed -i 's/deb-src/#deb-src/g' /target/etc/apt/sources.list
case "$machine" in
t1* | t2*)
    # passage des dépots sécurité sur mon_serveur_local
    sed -i 's/security.ubuntu.com/mon_serveur_local/g' /target/etc/apt/sources.list
    ;;
*)
    # passage des dépots sur ubuntu
    sed -i 's/mon_serveur_local/fr.archive.ubuntu.com/g' /target/etc/apt/sources.list
    ;;
esac
# ajout d'un dépot supplémentaire
case "$machine" in
t1* | t2* | t3*)
    echo 'deb http://mon_serveur_local/mon_programme/ ./' >> /target/etc/apt/sources.list
esac

#----------------------------------------------
# Préparation des scripts de fin d'installation
# Ces scripts seront exécutés au premier
# redémarrage de la machine
# fin_install_root appelle fin_install_user
#----------------------------------------------
# Création du fichier 'user'
if [ "$distrib" == "xubuntu" ]; then
    cat > /target/usr/bin/fin_install_user << eof
    #!/bin/bash
    # Configuration de Vino
    # La définition du mot de passe doit s'effectuer
    # avant l'autorisation de prise de controle
    gconftool-2 -s -t string /desktop/gnome/remote_access/vnc_password $(echo -n $mdp_vino | base64)
    gconftool-2 -s -t list --list-type string /desktop/gnome/remote_access/authentication_methods '[vnc]'
    gconftool-2 -s -t bool /desktop/gnome/remote_access/prompt_enabled false 
    gconftool-2 -s -t bool /desktop/gnome/remote_access/enabled true
    #
    # Création du fichier de lancement de Vino
    mkdir /home/$login/.config
    mkdir /home/$login/.config/autostart
    cat > /home/$login/.config/autostart/Vino.desktop << eof
    [Desktop Entry]
    Encoding=UTF-8
    Version=0.9.4
    Type=Application
    Name=Vino
    Comment=Vnc Server
    Exec=/usr/lib/vino/vino-server
    StartupNotify=false
    Terminal=false
    Hidden=false
    eof

    echo "eof" >> /target/usr/bin/fin_install_user
    
    cat >> /target/usr/bin/fin_install_user << eof

    # Création du fichier pour supprimer la notification de mise à jour système
    cat > /home/$login/.config/autostart/update-notifier.desktop << eof
    [Desktop Entry]
    Hidden=true
    eof

    echo "eof" >> /target/usr/bin/fin_install_user
else
    cat > /target/usr/bin/fin_install_user << eof
    #!/bin/bash
    # Configuration de l'interface
    # Désactivation des effets visuels
    gconftool-2 -s -t string /desktop/gnome/session/required_components/windowmanager 'metacity'
    # Modification des polices d'affichage
    gconftool-2 -s -t string /desktop/gnome/interface/font_name 'Sans 8'
    gconftool-2 -s -t string /desktop/gnome/interface/document_font_name 'Sans 8'    
    gconftool-2 -s -t string /desktop/gnome/interface/monospace_font_name 'Monospace 8'    
    gconftool-2 -s -t string /apps/nautilus/preferences/desktop_font 'Sans 8'    
    gconftool-2 -s -t string /apps/metacity/general/titlebar_font 'Sans Bold 8'    
    # Modification du thème
    gconftool-2 -s -t string /apps/metacity/general/theme 'Radiance'
    gconftool-2 -s -t string /desktop/gnome/interface/gtk_theme 'Radiance'
    gconftool-2 -s -t string /desktop/gnome/interface/icon_theme 'ubuntu-mono-light'    
    gconftool-2 -s -t string /apps/metacity/general/button_layout 'menu:minimize,maximize,close'
    # Configuration de la mise en veille
    #gconftool-2 -s -t int /apps/gnome-screensaver/idle_delay 5
    gconftool-2 -s -t bool /apps/gnome-screensaver/lock_enabled false
    # Configuration du nombre d'espaces de travail
    gconftool-2 -s -t int /apps/metacity/general/num_workspaces 1
    # Configuration de Vino
    # La définition du mot de passe doit s'effectuer
    # avant l'autorisation de prise de controle
    gconftool-2 -s -t string /desktop/gnome/remote_access/vnc_password $(echo -n $mdp_vino | base64)
    gconftool-2 -s -t list --list-type string /desktop/gnome/remote_access/authentication_methods '[vnc]'
    gconftool-2 -s -t bool /desktop/gnome/remote_access/prompt_enabled false 
    gconftool-2 -s -t bool /desktop/gnome/remote_access/enabled true
    eof
fi

# Création du fichier 'root'
cat > /target/usr/bin/fin_install_root << eof
#!/bin/bash
# Appel du script 'user'
su - $login -c /usr/bin/fin_install_user
# Effacement du script 'user'
rm /usr/bin/fin_install_user
# Effacement du script de fin d'installation dans cron
crontab -l > /usr/bin/tempcron
sed -i '/^@reboot /d' /usr/bin/tempcron
# ajout de la sauvegarde
case "$machine" in
t1* | t2*)
    # Génération d'une heure aléatoire entre (environ) 9h et 15h59
    heure=\\\\$(echo "scale=0;(\\\\$RANDOM/4700)+9" | bc)
    minute=\\\\$(echo "scale=0;(\\\\$RANDOM/550)" | bc)
    echo "\\\\$minute \\\\$heure * * * /usr/bin/mon_script_sauvegarde start" >> /usr/bin/tempcron
esac
crontab /usr/bin/tempcron
# Effacement du script de modification de cron
rm /usr/bin/tempcron 
/sbin/reboot
eof 
#--------------------------------------
# Fin des scripts de fin d'installation
#--------------------------------------

# Insertion des points de montage des partages
case "$machine" in
t1*)
    serveur="mon_serveur_1"
    ;;
t2*)
    serveur="mon_serveur_2"
    ;;
esac

case "$machine" in
t1* | t2*)
    mkdir /target/mnt/$serveur
    mkdir /target/mnt/$serveur/divers
    mkdir /target/mnt/$serveur/sauvegarde
    echo "//$serveur/divers   /mnt/$serveur/divers   cifs   auto,ro,password=,iocharset=utf8,codepage=cp850   0   0" >> /target/etc/fstab
    echo "//$serveur/sauvegarde   /mnt/$serveur/sauvegarde   cifs   noauto,rw,credentials=/etc/smb_sauvegarde,iocharset=utf8,codepage=cp850   0   0" >> /target/etc/fstab

    # Création du fichier de login pour sauvegarde
    cat > /target/etc/smb_sauvegarde << eof
    username=user_pour_sauvegarde
    password=mot_de_passe
    eof
    # Changement des droits du fichier
    chmod 600 /target/etc/smb_sauvegarde
    chown root:root /target/etc/smb_sauvegarde

    # Ajout du script de sauvegarde
    cat > /target/usr/bin/mon_script_sauvegarde << eof
    #!/bin/bash
    # ***** script de sauvegarde non détaillé ici *****
    eof

    # Ajout du fichier des exclusions (sauvegarde)
    cat > /target/etc/mon_script_sauve_excl << eof
    - cache*/
    - Cache*/
    - .cache*/
    - .Cache*/
    - /Examples
    - /.gvfs
    - lock
    - /.thumbnails/
    - trash/
    - Trash/
    - /.kde/
    - *.msf
    - *.*~
    eof

    # changement des droits du script de sauvegarde
    chmod 700 /target/usr/bin/mon_script_sauvegarde
    chown root:root /target/usr/bin/mon_script_sauvegarde
esac

# Changement des droits des scripts finaux
chmod 777 /target/usr/bin/fin_install_*

# Insertion du script final 'root' dans cron
chroot /target crontab -l > /target/usr/bin/tempcron
chroot /target echo "@reboot /usr/bin/fin_install_root" >> /target/usr/bin/tempcron
chroot /target crontab /usr/bin/tempcron

# Renommage de la machine
sed -i "s/kickseed/$machine/g" /target/etc/hostname
sed -i "s/kickseed/$machine/g" /target/etc/hosts

# Configuration de Ocsinventory
echo 'server=mon_serveur_local' > /target/etc/ocsinventory/ocsinventory-agent.cfg

# Envoi d'un mail de fin d'installation
chroot /target echo "Fin d'installation de la machine $machine de $utilisateur ($login)" | chroot /target mail -s "Fin d'installation de $machine" admin@mon_domaine.com

Utilisation

Déploiement par le réseau

L'installation d'Ubuntu (ou de ses variantes) par le réseau, avec ou sans connexion internet, offre de nombreux intérêts, dont celui d'obtenir une distribution parfaitement à jour dès la fin de l'installation, ce qui sera plus difficilement le cas avec un CD-ROM.

Éléments nécessaires

Pour parvenir à réaliser une installation par le réseau, il est nécessaire d'avoir un serveur DNS, DHCP, TFTP et HTTP (Lighttpd ou Apache 2 par exemple). Ceux-ci n'ont pas besoin d'être regroupés sur un seul serveur.

Déroulement de l'installation

Voici le déroulement d'une installation par le réseau :

  1. la nouvelle machine démarre sur le réseau (en mode PXE) et demande au serveur DHCP une adresse IP et les informations qui lui permettront de trouver son image de boot
  2. la nouvelle machine récupère sur le serveur tftp son image de boot
  3. la nouvelle machine prend sur le serveur http le fichier Kickstart
  4. la nouvelle machine effectue son installation en récupérant les paquets sur un serveur miroir local ou distant (l'accès internet est alors indispensable dans ce dernier cas).

Pour les deux premières étapes, vous trouverez de précieux compléments sur la page traitant de netboot.

Détails de configuration

Options dhcp pour un boot réseau

Pour que la machine qui va démarrer sur le réseau puisse trouver son image de boot, voici les instructions qui doivent figurer dans le serveur DHCP (fichier /etc/dhcpd.conf ou équivalent) :

# définit l'adresse ip du serveur tftp sur laquelle se trouve l'image de boot
next-server 192.168.xxx.xxx;
# chemin vers le répertoire racine du serveur tftp
option root-path "[répertoire racine du serveur tftp]";
# nom de l'image de boot
filename "pxelinux.0";
Obtenir un clavier français au menu de boot

Ajouter la ligne :

KBDMAP fr.kbd

au début du fichier [répertoire racine du serveur tftp]/ubuntu-installer/i386/boot-screens/menu.cfg et copier le fichier fr.kbd dans le répertoire racine du serveur tftp. Si vous ne trouvez pas ce fichier, une version est disponible sur ce site.

Ajout du fichier Kickstart au menu de boot

Dans le fichier [répertoire racine du serveur tftp]/ubuntu-installer/i386/boot-screens/text.cfg remplacez la ligne

label install
[...]
append vga=normal initrd=ubuntu-installer/i386/initrd.gz -- quiet

par (si le serveur tftp est également le serveur http)

label install
[...]
append vga=normal initrd=ubuntu-installer/i386/initrd.gz ks=/repertoire/fichier_ks.cfg -- machine=

ou par (si les serveurs tftp et http sont sur deux machines différentes)

label install
[...]
append vga=normal initrd=ubuntu-installer/i386/initrd.gz ks=http://ip_serveur_http/repertoire/fichier_ks.cfg -- machine=

Une fois au menu de boot, vous pourrez alors sélectionner "install" puis taper <TAB> pour compléter la ligne avec les variables de votre script (ici, machine est la première variable utilisée dans l'exemple avancé).

Personnalisation d'un CD-ROM

Pour personnaliser un CD-ROM d'installation, vous devez télécharger une image iso d'une distribution, la modifier pour y inclure les informations relatives à Kickstart (modification du menu, insertion du fichier Kickstart), générer une nouvelle iso spécifique puis la graver. Vous trouverez des informations plus détaillées de cette procédure dans la documentation anglaise de Kickstart pour Ubuntu.

FIXME

Voir aussi

  • kickstart.txt
  • Dernière modification: Le 28/04/2018, 11:17
  • (modification externe)