Utiliser Gitlab Pages comme repository Debian

Les Gitlab Pages (et Github Pages) permettent via un processus de construction d'artefact de publier un site web au travers d'un pipeline.

Un repository Debian étant simplement constitué de fichiers statiques, nous pouvons donc faire un rapprochement entre les pipelines de build et un repository Debian.

Pour réaliser notre repository Debian hébergé sur des gitlab pages nous aurons besoin:

  • Du conteneur docker debian:stretch
  • De GPG pour la signature du repository
  • De reprepro pour créer notre repository
  • D'un repository git hébergé sur un Gitlab

Initialisation du repository

Créer un répertoire sur votre machine et initialisez le lien avec Gitlab:

mkdir debianrepo
cd debianrepo
git init
git remote add origin git@gitlab.com:nerzhul/debianrepo.git

Génération de la clef GPG

Dans un premier temps nous aurons besoin d'une clef GPG pour notre repository. Générez une clef:

gpg --gen-key

On va ensuite exporter la clef publique et la clef privée dans notre repository local:

mkdir repo_meta
gpg --armor --output repo_meta/gpg-public.key --export BDB31B849949AD389C76573EF02015F1E3A69CF2
gpg --export-secret-keys -a BDB31B849949AD389C76573EF02015F1E3A69CF2 > repo_meta/gpg-private.key

Note: exposer la clef privée dans le repository n'est pas recommandé, il est plus judicieux d'utiliser les secret variables de Gitlab pour stocker le contenu de la clef privée. Il s'agit juste de simplifier l'exercice ici

Création du fichier de définition du repository

Créez un fichier repo_distributions dans le répertoire repo_meta. Celui-ci nous servira plus tard, lors de la création du repository. Notez bien que la ligne SignWith contient le fingerprint de la clef GPG précédemment créée

Origin: Debian
Label: Debian
Codename: stretch
Architectures: amd64
Components: main
Description: Apt repository for the posterity
SignWith: BDB31B849949AD389C76573EF02015F1E3A69CF2

Création du pipeline de construction du repository

Le pipeline de repository s'appuie sur le fichier .gitlab-ci.yml de Gitlab. Voici le fichier que nous allons utiliser, nous le détaillerons juste après:

---
image: debian:stretch

stages:
  - package
  - deploy

variables:
  DEBIAN_VERSION: "stretch"
  ETCD_VERSION: 3.2.7
  RUNDECK_VERSION: 2.9.3-1

package:etcd:
  stage: package
  before_script:
    - find etcd -type d -exec chmod 755 {} \;
    - find etcd -type f -not -name postinst -exec chmod 644 {} \;
    - find etcd -type f -name postinst -exec chmod 755 {} \;
    - mkdir -p build/ dist/
    - apt-get -qy update > /dev/null
    - apt-get -qyy install wget > /dev/null
  script:
    - sed -i 's/%%ETCD_VERSION%%/'${ETCD_VERSION}'/g' etcd/DEBIAN/control
    - mkdir -p etcd/usr/bin/
    - cd build/
    - wget https://github.com/coreos/etcd/releases/download/v${ETCD_VERSION}/etcd-v${ETCD_VERSION}-linux-amd64.tar.gz
    - tar xzf etcd-v${ETCD_VERSION}-linux-amd64.tar.gz
    - cp etcd-v${ETCD_VERSION}-linux-amd64/etcd etcd-v${ETCD_VERSION}-linux-amd64/etcdctl ../etcd/usr/bin/
    - cd ..
    - dpkg-deb -b etcd/
    - mv etcd.deb dist/
  artifacts:
    when: on_success
    expire_in: 1 week
    paths:
      - dist/*

package:rundeck:
  stage: package
  before_script:
    - apt-get -qy update > /dev/null
    - apt-get -qyy install wget > /dev/null
    - mkdir dist/
  script:
    - cd dist/
    - wget http://dl.bintray.com/rundeck/rundeck-deb/rundeck-${RUNDECK_VERSION}-GA.deb
  artifacts:
    when: on_success
    expire_in: 1 week
    paths:
      - dist/*

pages:
  stage: deploy
  only:
    - master
  dependencies:
    - package:etcd
    - package:rundeck
  before_script:
    - apt-get -qy update > /dev/null
    - apt-get -qyy install reprepro > /dev/null
    - gpg --import repo_meta/gpg-private.key
  script:
    - mkdir -p public/conf
    - cp repo_meta/repo_distributions public/conf/distributions
    - cp repo_meta/gpg-public.key public/repo.key
    - cd public
    - reprepro includedeb ${DEBIAN_VERSION} ../dist/*.deb
  artifacts:
    when: on_success
    expire_in: 1 year
    paths:
      - public

Notre pipeline se décompose en 2 phases:

  • Construction des paquets du repository
  • Création et déploiement du repository

La phase de déploiement nécessite de connaître les paquets Debian construits. Par convention les paquets Debian construits seront placés dans le répertoire dist/ qui sera transféré à la phase de déploiement des Gitlab Pages.

Nous avons ici 2 paquets différents, Etcd et Rundeck qui sont 2 outils libres. Le premier ne fournit pas de paquet Debian, le second oui.

Création des paquets

Commençons par Rundeck, le plus simple.

package:rundeck:
  stage: package
  before_script:
    - apt-get -qy update > /dev/null
    - apt-get -qyy install wget > /dev/null
    - mkdir dist/
  script:
    - cd dist/
    - wget http://dl.bintray.com/rundeck/rundeck-deb/rundeck-${RUNDECK_VERSION}-GA.deb
  artifacts:
    when: on_success
    expire_in: 1 week
    paths:
      - dist/*

Dans la section __before_script__, nous mettons ce qui ne concerne pas le build, ici l'installation de wget pour télécharger le paquet.

Nous nous plaçons ensuite dans le répertoire dist et téléchargeons la version de Rundeck spécifiée dans les variables du CI, plus haut.

Les artefacts intermédiaires sont ensuite sauvegardés pour 1 semaine. Pour rappel on peut télécharger les artefacts depuis l'interface de Gitlab sur chaque pipeline.

Passons maintenant au paquet etcd:

package:etcd:
  stage: package
  before_script:
    - find etcd -type d -exec chmod 755 {} \;
    - find etcd -type f -not -name postinst -exec chmod 644 {} \;
    - find etcd -type f -name postinst -exec chmod 755 {} \;
    - mkdir -p build/ dist/
    - apt-get -qy update > /dev/null
    - apt-get -qyy install wget > /dev/null
  script:
    - sed -i 's/%%ETCD_VERSION%%/'${ETCD_VERSION}'/g' etcd/DEBIAN/control
    - mkdir -p etcd/usr/bin/
    - cd build/
    - wget https://github.com/coreos/etcd/releases/download/v${ETCD_VERSION}/etcd-v${ETCD_VERSION}-linux-amd64.tar.gz
    - tar xzf etcd-v${ETCD_VERSION}-linux-amd64.tar.gz
    - cp etcd-v${ETCD_VERSION}-linux-amd64/etcd etcd-v${ETCD_VERSION}-linux-amd64/etcdctl ../etcd/usr/bin/
    - cd ..
    - dpkg-deb -b etcd/
    - mv etcd.deb dist/
  artifacts:
    when: on_success
    expire_in: 1 week
    paths:
      - dist/*

Pour etcd nous construisons un paquet Debian depuis des binaires fournis par les développeurs. Le répertoire etcd contient l'arborescence minimale du paquet, à savoir la configuration, l'unit system et les fichiers control et postinst de Debian.

Dans l'étape __before_script__ nous avons également besoin de wget, mais également de corriger les permissions sur le répertoire etcd du repository, le Gitlab CI changeant les droits sur les fichiers. Je n'ai pas réussi à comprendre pourquoi, celles-ci sont correctes dans git.

L'étape de build se décompose ensuite de la manière suivante:

  • On modifie le fichier control du paquet afin de spécifier la version du paquet etcd
  • On télécharge l'archive etcd du release concerné, qu'on extrait
  • On copie les binaires nous intéressant dans le paquet dans /usr/bin
  • On construit le paquet avec dpkg-deb
  • On bouge le paquet dans le répertoire dist

Enfin, tout comme pour Rundeck, on archive l'artefact.

Création du repository Debian et publication

Notre dernière tâche consiste à créer le repository Debian pour l'exposer via les Gitlab Pages

pages:
  stage: deploy
  only:
    - master
  dependencies:
    - package:etcd
    - package:rundeck
  before_script:
    - apt-get -qy update > /dev/null
    - apt-get -qyy install reprepro > /dev/null
    - gpg --import repo_meta/gpg-private.key
  script:
    - mkdir -p public/conf
    - cp repo_meta/repo_distributions public/conf/distributions
    - cp repo_meta/gpg-public.key public/repo.key
    - cd public
    - reprepro includedeb ${DEBIAN_VERSION} ../dist/*.deb
  artifacts:
    when: on_success
    expire_in: 1 year
    paths:
      - public

L'étape du pipeline doit obligatoirement se nommer pages par convention de Gitlab et le livrable du repository doit se situer dans le répertoire public.

Nous ajoutons nos deux étapes de construction de paquets en dépendances, afin d'avoir les artefacts à disposition pour cette étape, puis nous installons reprepro qui va nous permettre de construire un repository Debian facilement, et nous importons la clef GPG privées dans le trousseau du conteneur de build.

La construction du repository se fait ensuite de la manière suivante:

  • Copie du fichier repo_meta/repo_distributions vers public/conf/distributions, utilisé par reprepro pour construire le repository
  • Copie de la clef GPG publique vers public/repo.key afin de la distribuer à nos clients
  • En se positionnant dans le répertoire public, inclusion de l'ensemble des fichiers deb du répertoire dist/ dans le repository

Enfin nous archivons le repository pour une durée de 1 an, afin d'assurer sa pérennité dans le temps.

Vous pouvez maintenant commiter et pousser tous les changements

Résultat

Allez maintenant sur votre repository Gitlab dans la section pipelines, vous devriez avoir un résultat similaire:

Vous savez désormais construire une repository Debian en ajoutant dynamiquement des paquets construits à partir d'un pipeline Gitlab. Je vous invite à consulter le repository ayant servi de PoC puis de référence pour cet article:

[Serveur Dédié]OpenVPN

Dans cette article nous allons mettre en oeuvre un serveur OpenVPN en nous servant de l’article suivant.

Je ne commenterai que les modifications que j’ai faites par rapport à cet article sur le serveur ainsi que le client.

Serveur

J’ai copié le dossier easy-rsa dans /etc/openvpn qui été présent pour ne pas jongler entre différents répertoires concernant la configuration et l’utilisation de OpenVPN.

J’ai noter une différence dans le fichier vars avec la possibilité d’indiquer nativement des informations relatifs a son utilisation au sein d’un annuaire LDAP et l’utilisation de carte à puce via PKCS. Continuer à lire

Installation automatisée de Debian par le réseau

Debian est une distribution communautaire très populaire, prônant la stabilité.

L'installeur de Debian est extrêmement complet et il permet de faire une installation par le réseau sans avoir à toucher son clavier. Cette fonction est extrêmement utile pour du déploiement d'échelle sur une ferme de serveurs, ou même sur une infrastructure moyenne, pour installer Debian sans bouger de son bureau (enfin si, il faut appuyer sur le bouton de démarrage de la machine).

Etape 1: serveur TFTP

Dans un premier temps nous allons installer et configurer un serveur TFTP pour faire du PXE.

Pour de bonnes performances, nous n'utiliserons pas le démon fourni par inetd, étant un peu lent. Le déploiement sera fait depuis un FreeBSD 9.1, mais peut être fait sous Linux

cd /usr/ports/ftp/tftp-hpa
make install clean

On va maintenant configurer proprement notre serveur tftp. Nous installerons les fichiers dans /usr/local/tftp et /usr/local/tftp/pxe pour nos boot PXE

mkdir -p /usr/local/tftp/pxe

Etape 2: PXE

Etape 2.1: Debian, PXELinux et TFTP

Pour la partie PXE, Debian nous fournit tout ce donc nous avons besoin.

Téléchargez l'archive suivante et décompressez la dans le répertoire pxe nouvellement créé:

fetch http://ftp.fr.debian.org/debian/dists/wheezy/main/installer-amd64/current/images/netboot/netboot.tar.gz
cd /usr/local/tftp/pxe
tar xvzf netboot.tar.gz

L'arborescence devrait ressembler à ceci:

pxelinux.0
version.info
debian-installer/
pxelinux.cfg/

Etape 2.2: PXE et DHCP

Il faut maintenant configurer le DHCP pour faire du PXE. Ici plusieurs choix s'offrent à vous. Soit vous décidez d'un déploiement par réseau ou par hôte.

Si le déploiement est ponctuel et que vos machines sont toujours en DHCP (cas de PC clients par exemple), je vous suggère de le lier à un hôte.

En revanche s'il s'agit d'un déploiement de serveurs, il peut être judicieux de garder un range de 4-5 adresses DHCPdynamiques pour le boot PXE, les serveurs n'étant (normalement) pas en DHCP une fois installés, et le PXE désactivé après installation.

Que l'un ou l'autre des cas soit choisi, vous devrez ajouter les 2 lignes suivantes à l'hôte/subnet (1.2.3.4 étant l'IP de votre serveur TFTP)

next-server 1.2.3.4;
filename "pxe/pxelinux.0";

Votre configuration PXE est prête.

Note: Si vous vous arrêtez à ce stade de l'installation, vous pourrez déployer vos machines manuellement via le réseau, comme si vous utilisiez le CD de netinstall de Debian.

Etape 3: Configuration de pxelinux

Notre but étant d'établir des installation automatisées et personnalisées, il va falloir travailler encore un peu.

Pour rappel, pxelinux va demander le fichier de configuration pxelinux de la manière suivante:

/pxe/pxelinux.cfg/01-88-99-aa-bb-cc-dd
/pxe/pxelinux.cfg/C0A87A0A
/pxe/pxelinux.cfg/C0A87A0
/pxe/pxelinux.cfg/C0A87A
/pxe/pxelinux.cfg/C0A87
/pxe/pxelinux.cfg/C0A8
/pxe/pxelinux.cfg/C0A
/pxe/pxelinux.cfg/C0
/pxe/pxelinux.cfg/C
/pxe/pxelinux.cfg/default
  • 01-88-99-aa-bb-cc-dd: correspond à 01-adresse-mac
  • C000025B: l'adresse IP de la machine en hexadécimal (ici 192.168.122.10)
  • default: le fichier par défaut

Notre but étant de personnaliser chaque machine (la configuration réseau et le nom d'hôte, notamment), nous allons utiliser la notation par IP (réservation DHCP oblige).

Créez le fichier /usr/local/etc/pxe/pxelinux.cfg/C0A87A0A (IP de votre machine en hexa) et insérez le contenu suivant:

include debian-installer/amd64/boot-screens/bootscreen-custom.cfg
default install
label install
    menu label ^Install
    menu default
    kernel debian-installer/amd64/linux url=tftp://1.2.3.4/pxe/debian-installer/./preseed-custom.cfg netcfg/get_domain=domain.tld netcfg/get_hostname=myname languagechooser/language-name=French countrychooser/shortlist=FR debian-installer/locale=fr_FR.UTF-8 keyboard-configuration/xkb-keymap=fr
    append vga=788 initrd=debian-installer/amd64/initrd.gz -- quiet
    prompt 0
    timeout 0

default debian-installer/amd64/boot-screens/vesamenu.c32

Ce fichier est le plus important. Il va indiquer à votre machine sa configuration de base, lui permettant d'accéder au réseau et à ses autres paramètres. Détaillons un peu la ligne du kernel.

La ligne kernel définit le noyau et des options de boot nécessaires à l'installeur Debian pour se mettre en réseau. Vous notererez que ce sont les premières questions de l'installeur en mode normal.

  • url: le chemin vers le fichier de configuration de l'installation automatisée (preseed). Cela peut être un serveur Apache, un serveur FTP ou encore un serveur TFTP. Dans notre cas, nous préférerons le TFTP, le preseed contenant le mot de passe de l'utilisateur root de la machine. L'utilisation du /./ n'est pas une faute de frappe, il s'agit d'un élément obligatoire séparant le répertoire du nom de fichier.
  • netcfg/get_domain: le suffixe DNS du nom d'hôte
  • netcfg/get_hostname: le nom (court) d'hôte de la machine
  • languagechooser/language-name: la langue de l'installeur
  • countrychooser/shortlist: le nom court correspondant au language-name
  • debian-installer/locale: quel fichier de localisation l'installeur Debian doit utiliser
  • keyboard-configuration/xbk-keymap: quel clavier configurer

Avant de passer au fichier preseed, nous allons customiser un peu les fichiers de Debian Installer afin de les épurer. Ouvrez le fichier /usr/local/tftp/pxe/debian-installer/amd64/boot-screens/bootscreen-custom.cfg et laissez uniquement les lignes suivantes:

menu hshift 7
menu width 61

menu title ^GDebian GNU/Linux automated installer boot menu
include debian-installer/amd64/boot-screens/stdmenu.cfg

Etape 4: Configuration de l'installeur Debian

Passons maintenant aux choses sérieuses. Nous allons configurer toutes les options de l'installeur Debian afin de formater la machine, installer les paquets, le bootloader...

Etape 4.1: locales

Dans un premier temps nous allons configurer la langue pour le système que l'on va installer et le clavier:

d-i debian-installer/locale string fr_FR
d-i keymap select fr

Etape 4.2: réseau

Le système va devoir choisir automatiquement une interface réseau. Nous allons dire à l'installeur de choisir automatiquement une interface. Si plusieurs interfaces sont connectées, il est possible de forcer celle-ci en précisant son nom (eth0...)

d-i netcfg/choose_interface select auto

Etape 4.3: miroir Debian

On configure maintenant l'accès au repository Debian (ici http://ftp.fr.debian.org/Debian). Si vous utilisez un ftp, vous pouvez l'utiliser dans la partie protocol.

d-i mirror/protocol string http
d-i mirror/country string manual
d-i mirror/http/hostname string ftp.fr.debian.org
d-i mirror/http/directory string /debian

Si vous utilisez un proxy, vous aurez besoin d'ajouter l'option suivante:

d-i mirror/http/proxy string http://myproxy:3128

On va maintenant dire à l'installeur quelle version de la distribution il doit installer. Cette option est extrêmement pratique, puisqu'elle vous permettra de garder le même système de déploiement au fil des versions.

d-i mirror/suite string wheezy
d-i mirror/udeb/suite string wheezy

Etape 4.4: utilisateurs

Passons maintenant à la configuration des comptes. On configure dans un premier temps le compte root:

d-i passwd/root-password password rootStr0ngPWD
d-i passwd/root-password-again password rootStr0ngPWD

Vous noterez que le mot de passe est en clair. Il est possible de le mettre au format MD5. L'utilisation du TFTP s'avère pratique dans notre cas, nous permettant de ne le rendre disponible que pour le serveurs et ainsi de cacher le mot de passe root. Cette fonction n'exclut pas le changement de mot de passe une fois l'installation terminée.

On va maintenant configurer l'utilisateur non privilégié de la machine (login, nom et mot de passe).

d-i passwd/username string unixxp
d-i passwd/user-fullname string John Doe
d-i passwd/user-password password unixxppwd
d-i passwd/user-password-again password unixxppwd

Si vous souhaitez forcer l'UID de l'utilisateur, vous pouvez ajouter la ligne suivante:

d-i passwd/user-uid string 1001

Etape 4.5: horloge

Passons maintenant à la configuration du temps. On définit si l'horloge matérielle est UTC, puis le fuseau et enfin un serveur NTP.

d-i clock-setup/utc boolean true
d-i time/zone string Europe/Paris
d-i clock-setup/ntp-server string ntp.unix-experience.fr

Etape 4.6: disques

La partie suivante consiste à configurer les disques. Il est possible de faire quelque chose de complexe, avec du LVM chiffré, multi partitions, etc... nous allons nous contenter de quelque chose de simple à une seule partition.

Tout d'abord on définit le disque sur lequel installer et la méthode

d-i partman-auto/disk string /dev/sda
d-i partman-auto/method string regular

Ensuite on va nettoyer le LVM et les arrays MD existants, s'il y en a

d-i partman-lvm/device_remove_lvm boolean true
d-i partman-md/device_remove_md boolean true
d-i partman-lvm/confirm boolean true
d-i partman-lvm/confirm_nooverwrite boolean true

On installe tout dans une seule partition (atomic). Si vous voulez séparer le /home, indiquez home et si vous voulez séparer /home, /usr, /var, /tmp indiquez multi.

d-i partman-auto/choose_recipe select atomic

Les options suivantes vont permettre de partitionner automatiquement le disque.

d-i partman-partitioning/confirm_write_new_label boolean true
d-i partman/choose_partition select finish
d-i partman/confirm boolean true
d-i partman/confirm_nooverwrite boolean true
d-i partman-md/confirm boolean true
d-i partman-partitioning/confirm_write_new_label boolean true
d-i partman/choose_partition select finish
d-i partman/confirm boolean true
d-i partman/confirm_nooverwrite boolean true

Enfin on va demander à partman de monter les partitions par UUID.

d-i partman/mount_style select uuid

Etape 4.7: installation du système de base

On va maintenant installer le système de base. On va dire à l'installeur quel meta-paquet installer. Pour Debian 64bits c'est linux-image-amd64:

d-i base-installer/kernel/image string linux-image-amd64

Etape 4.8: repositories additionnels

On va maintenant configurer Debian afin d'utiliser des repositories et flavors. Dans un premier temps, on active les flavors non-free et contrib pour le repository ftp.frdebian.org précédemment configuré.

d-i apt-setup/non-free boolean true
d-i apt-setup/contrib boolean true

Si vous possédez un repository local additionnel avec des paquets supplémentaires, par exemple, vous pourrez indiquer jusqu'à 10 repositories locaux (local0-9).

d-i apt-setup/local0/repository string \
       http://mirror.mydomain.tld/pub/Debian wheezy main contrib non-free

Si jamais celui-ci n'est pas authentifié (GPG), ajoutez la ligne suivante (non recommandé, préférez toujours un apt-key add)

d-i debian-installer/allow_unauthenticated boolean true

Etape 4.9: installation de paquets additionnels

tasksel et pkgsel vont nous permettre d'installer des paquets additionnels. tasksel correspond à la fenêtre vous proposant un environnement de bureau, serveur web, SSH... Ici nous voulons quelque chose de minimaliste, on le met à none.

tasksel tasksel/first multiselect none

Néanmoins, nous voulons installer quelques paquets de plus, comme openssh et puppet, on va donc dire à pkgsel de nous les installer:

d-i pkgsel/include string openssh-server puppet

Etape 4.10: popularity-contest

Si vous souhaitez activer les sondages sur l'utilisation des paquets, activez l'option autrement laissez à false.

popularity-contest popularity-contest/participate boolean false

Etape 4.11: bootloader

Pour terminer nous allons installer le grub à la racine de notre disque et dire à l'installeur de redémarrer:

d-i grub-installer/only_debian true
d-i grub-installer/bootdev string /dev/sda

d-i finish-install/reboot_in_progress note

Etape 4.12: commandes additionnelles (facultatif)

Si vous souhaitez lancer quelques commandes avant le démontage des disques et le redémarrage, indiquez les dans l'option late_command.

d-i preseed/late_command string echo "Just a late command" > /target/tmp/useless.tmp

Voilà, vous avez terminé votre preseed !

Afin de récapituler, voici le fichier que vous devriez avoir au final:

#### Contents of the preconfiguration file (for wheezy)
### Localization
d-i debian-installer/locale string fr_FR
d-i keymap select fr

### Network configuration
d-i netcfg/choose_interface select auto

### Mirror settings
d-i mirror/protocol string http
d-i mirror/country string manual
d-i mirror/http/hostname string ftp.fr.debian.org
d-i mirror/http/directory string /debian
d-i mirror/http/proxy string http://myproxy:3128

# Suite to install.
d-i mirror/suite string wheezy
d-i mirror/udeb/suite string wheezy

### Account setup
d-i passwd/root-password password rootStr0ngPWD
d-i passwd/root-password-again password rootStr0ngPWD

# To create a normal user account.
d-i passwd/user-fullname string UNIXExperience
d-i passwd/username string unixxp
d-i passwd/user-password password unixxppwd
d-i passwd/user-password-again password unixxppwd
d-i passwd/user-uid string 1001

### Clock and time zone setup
d-i clock-setup/utc boolean true
d-i time/zone string Europe/Paris
d-i clock-setup/ntp-server string ntp.unix-experience.fr

### Partitioning
d-i partman-auto/disk string /dev/sda
d-i partman-auto/method string regular

d-i partman-lvm/device_remove_lvm boolean true
d-i partman-md/device_remove_md boolean true
d-i partman-lvm/confirm boolean true
d-i partman-lvm/confirm_nooverwrite boolean true

d-i partman-auto/choose_recipe select atomic

d-i partman-partitioning/confirm_write_new_label boolean true
d-i partman/choose_partition select finish
d-i partman/confirm boolean true
d-i partman/confirm_nooverwrite boolean true

# This makes partman automatically partition without confirmation.
d-i partman-md/confirm boolean true
d-i partman-partitioning/confirm_write_new_label boolean true
d-i partman/choose_partition select finish
d-i partman/confirm boolean true
d-i partman/confirm_nooverwrite boolean true

## Controlling how partitions are mounted
d-i partman/mount_style select uuid

### Base system installation
d-i base-installer/kernel/image string linux-image-amd64

### Apt setup
d-i apt-setup/non-free boolean true
d-i apt-setup/contrib boolean true

# Additional repositories, local[0-9] available
d-i apt-setup/local0/repository string \
       http://mirror.mydomain.tld/pub/Debian wheezy main contrib non-free
d-i debian-installer/allow_unauthenticated boolean true

### Package selection
tasksel tasksel/first multiselect none

d-i pkgsel/include string openssh-server

popularity-contest popularity-contest/participate boolean false

d-i grub-installer/only_debian true
d-i grub-installer/bootdev string /dev/sda

### Finishing up the installation
d-i finish-install/reboot_in_progress note

d-i preseed/late_command string echo "Just a late command" > /target/tmp/useless.tmp

Conclusion

Un axe d'amélioration serait de coupler l'installeur avec puppet afin de déployer la machine intégralement et automatiquement. Ceci fera l'objet d'un autre article.

Vous disposez désormais d'une petite infrastructure vous permettant d'automatiser rapidement l'installation de Debian sur votre parc, vous n'avez plus besoin de rester derrière la console de votre serveur pour installer la machine, elle se configure tout seule !

Sources

http://www.debian.org/distrib/netinst http://www.syslinux.org/wiki/index.php/PXELINUX http://www.debian.org/releases/stable/i386/apb.html http://www.debian.org/releases/stable/example-preseed.txt