Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 09/12/2008, à 17:53

m2nis

Installation automatisée de (U|Ku|Xu)buntu en réseau avec Kickstart

Bonjour à tous,

Depuis quelques jours, je suis en train de me faire la main sur Kickstart (que j'ai découvert presque par hasard) et dont l'objectif est d'automatiser une installation Ubuntu (ou de ses dérivés). Pour ma part, c'est d'ailleurs l'installation de Xubuntu pour un poste de type "bureautique" que je souhaitais automatiser.

Précision importante : tous les tests présentés ci-dessous ont été réalisés sur la base de la version 8.04 LTS.

Pour ce qui concerne ma découverte, elle s'est complétée/compliquée smile par le souhait d'installer l'ensemble via un boot réseau (que je n'avais jamais utilisé) et l'utilisation d'un miroir Ubuntu local (existant).

Pourquoi partager tout ceci ? Parce que pour arriver à ce "beau" résultat, encore très partiel, il m'a fallu lire des kilomètres de documentation, souvent en anglais. Si je peux donc aider certains à gagner un peu de temps, pour peu que leurs contraintes soient à peu près similaires, tant mieux.

Premier problème donc, booter sur le réseau. Mon serveur dhcp était existant et n'était pas le serveur contenant le fichier kickstart, le serveur tftp et le miroir. Beaucoup de temps perdu sur cette simple étape avec une erreur "pxe-e32: tftp open timeout" que j'ai mis longtemps à résoudre. Finalement, c'est la machine de test que j'utilisais qui posait problème ! sad A tout hasard, si quelqu'un cherche aussi, sachez que l'essentiel à retenir tient dans ces quelques lignes (ici, seule la machine définie par son adresse mac est renvoyée vers le fichier de boot):

host fix6 # pour essai
{
    #adresse mac de la machine à installer
    hardware ethernet 00:00:00:xx:xx:xx;
    #adresse ip qui sera attribuée à la machine à installer
    fixed-address 192.168.168.100;
    #adresse ip du serveur contenant le serveur tftp
    next-server 192.168.168.2;
    #nom du fichier de boot
    filename "pxelinux.0";
    #chemin vers la racine du serveur tftp
    option root-path "/var/lib/tftpboot";
}

Pour le serveur tftp, j'ai utilisé tftpd-hpa. Pour le configurer, il y a sur le net pas mal de choses dessus et sur inetd (ou xinetd). Pour le tester en mode normal avant, vous pouvez utiliser tftp-hpa.

Sur le serveur tftp, vous devrez installer les fichiers nécessaires au boot. Je n'ai pas conservé beaucoup de trace de cette partie. Recherchez le fichier netboot.tar.gz correspondant à la version du système que vous souhaitez installer.

Enfin, le fichier kickstart. Voici le mien pour l'instant avec un certain nombre de commentaires sur ce que j'ai pu trouver/expérimenter. Si certains y trouvaient des erreurs/incohérences, les corrections seront la bienvenue, tant pour moi que pour ceux qui pourraient s'aider de cet exemple.

# Squelette généré par Kickstart Configurator
# platform=x86

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

# Modules de langue à installer
langsupport fr_FR

# Clavier
keyboard fr_oss

# 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
# Ici, pas d'utilisateur par défaut (ligne commentée dans le fichier)
# car il est différent à chaque installation.
# Il sera donc demandé au cours de l'installation.
#user xubuntu --fullname "Utilisateur par défaut" --iscrypted --password xxxxx

# Reboot après installation
# Ligne commentée car installation par le réseau. Il faut être présent en fin
# d'installation pour redémarrer sur le disque dur.
#reboot

# Installation en mode texte
text

# Installation en mode interactif
# Nécessaire dans mon cas pour pouvoir notamment entrer le nom d'utilisateur,
# partitions etc...
interactive

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

# Installation par le réseau
# Il est probable qu'une url des miroirs Ubuntu officiels fonctionnerait
# exactement de la même façon.
url --url http://mon_serveur_miroir_local/ubuntu/

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

# Destruction des tables de partitions invalides
zerombr yes

# Suppression des partitions du système, puis création de nouvelles
# Pas de préconfiguration pour l'instant. Le système proposera donc
# une utilisation complète du disque avec ses choix de répartition de l'espace disque.
# Demande confirmation avant écrasement
clearpart --all --initlabel

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

# Configuration du réseau
network --bootproto=dhcp --device=eth0

# Configuration du pare-feu
firewall --disabled

# Ne pas configurer X pour le système
# La ligne ci-dessous a été remplacée par la suivante. Mais j'ai un doute sur l'utilité.
# Ma petite dizaine d'installation ne m'a pas permis de tout valider encore. :)
#skipx

# Configuration du système X Window
xconfig --depth=32 --resolution=1024x768 --defaultdesktop=XFCE --startxonboot

# Acceptation de la license Java
# L'installation de Java génère un message demandant la validation de la licence.
# Pénible, d'autant que cela intervient bien après les demandes de début d'installation
# (user, disque, etc...). Cette validation m'a demandé beaucoup de recherches, mais
# la possibilité d'utiliser les commandes "preseed" semble ouvrir des possibilités
# importantes pour la configuration du système.
preseed --owner sun-java5-bin shared/accepted-sun-dlj-v1-1 boolean true

# Suppresion/Installation des paquets supplémentaires
# Pour l'instant, il semble que la suppression ne fonctionne pas. Y a-t-il un ordre à respecter ?
# L'option resolvedeps permet de résoudre les dépendances des paquets.
%packages --resolvedeps
xubuntu-desktop
-abiword
-evince-gtk
-gnome-games
-gnumeric
-pidgin
-transmission-gtk
evince
#msttcorefonts
ntp
numlockx
ocsinventory-agent
openoffice.org
openoffice.org-gtk
smbfs
sun-java5-jre
sun-java5-plugin
vino

%post
# La ligne ci-dessous permet de remplacer le serveur ntp (mise à jour de l'heure)
# par un autre, ici mon serveur local.
sed -i 's/server ntp.ubuntu.com/server mon_serveur_local/g' /etc/ntp.conf

Voilà. Si cela peut aider quelqu'un...

Dernière modification par m2nis (Le 22/12/2008, à 11:51)


Michaël.

Hors ligne

#2 Le 18/12/2008, à 08:09

m2nis

Re : Installation automatisée de (U|Ku|Xu)buntu en réseau avec Kickstart

Mes recherches m'ont permis de trouver encore pas mal de choses. La plus intéressante est assurément le fait que la ligne de commande tapée pour lancer l'installation peut être lue dans le fichier kickstart (/proc/cmdline). Cela permet donc de passer tous les paramètres que l'on souhaite et d'avoir ensuite une installation complète sans aucune intervention.

Dans mon cas, cette ligne de commande peut donc ressembler à:
linux ks=http://mon_serveur_miroir_local/ubuntu/mon_fichier_ks.cfg machine=test25 mdp=password reboot=oui

Enfin, au passage, pour mieux comprendre ce qui s'est passé pendant l'installation, on peut retrouver tout le log dans /var/log/installer/syslog.

Voici donc l'évolution de mon fichier ks (certains commentaires "détaillés" ne sont pas repris):

# Squelette généré par Kickstart Configurator
# platform=x86

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

# Modules de langue à installer
langsupport fr_FR

# Clavier
keyboard fr_oss

# 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

# Installation par le réseau
url --url http://mon_serveur_miroir_local/ubuntu/

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

# Destruction des tables de partitions invalides
zerombr yes

# Suppression des partitions du système
clearpart --all --initlabel

# Définition des partitions
# Ici, 1Go pour le swap, le reste pour /
part swap --size 1024 --fstype swap --asprimary
part / --size 1024 --fstype ext3 --asprimary --grow

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

# Configuration du réseau - config en section %pre
%include /tmp/network_conf

# Configuration du pare-feu
firewall --disabled

# Ne pas configurer X pour le système
#skipx

# Configuration du système X Window
# Pour l'instant, la résolution n'est pas correctement prise en compte.
# Solution pas encore cherchée.
xconfig --depth=32 --resolution=1280x1024 --defaultdesktop=XFCE --startxonboot

# Acceptation de la license Java
preseed --owner sun-java5-bin shared/accepted-sun-dlj-v1-1 boolean true

# Suppresion/Installation des paquets supplémentaires
# La suppression des paquets avec '-' ne fonctionne pas quelque soit la place.
# L'utilisation dans %post de 'apt-get remove' ne fonctionne pas non plus.
# Solution pas encore trouvée.
# Les paquets 'mailx' et 'ssmpt' sont sélectionnés dans le but de confirmer la fin d'installation par
# un mail, mais pour l'instant, je ne parviens pas à le faire partir.
%packages --resolvedeps
xubuntu-desktop
evince
mailx
#msttcorefonts
ntp
numlockx
ocsinventory-agent
openoffice.org
openoffice.org-gtk
smbfs
ssmtp
sun-java5-jre
sun-java5-plugin
vino
-abiword
-evince-gtk
-gnome-games
-gnumeric
-pidgin
-transmission-gtk

%pre

# Lecture et mise en variables des paramètres d'installation
# C'est avec ces deux lignes que l'on récupère tous les paramètres
# passé dans la ligne d'appel. Ces variables ne seront utilisables que
# dans la section %pre, ce qui explique la création des fichiers dans /tmp
# Ils permettent de conserver les paramètres pendant toute la durée
# de l'installation.
# Ces deux lignes peuvent elles au moins être réattribuées à celui
# qui m'a permis de les trouver car j'avais fait un marque page:
# http://mail.linux.ie/pipermail/ilug/2008-March/097375.html
set -- `cat /proc/cmdline`
for I in $*; do case "$I" in *=*) eval $I;; esac; done

# En cas d'absence d'une variable, il est possible de stopper l'installation
# (ou de lui donner une valeur par défaut [plus bas]).
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="temp"
fi

# Gestion de la variable pour affichage ci-dessous uniquement
if [ "$reboot" != "oui" ]; then
  reboot="non"
fi

# Résumé de l'installation. Mes premiers essais de demande
# de confirmation avec l'instruction 'read' n'ont pas abouti.
# A vérifier pour plus de sécurité, le disque dur étant, dans
# le cas présent, entièrement effacé sans autre confirmation.
echo "*********************************** "
echo "**     Résumé d\'installation     ** "
echo "*********************************** "
echo " "
echo "*********************************** "
echo "** Nom de la machine     = $machine "
echo "** Nom de l\'utilisateur  = $utilisateur "
echo "** Login                 = $login"
echo "** Mot de passe          = $mdp "
echo "** Reboot après install. = $reboot "
echo "*********************************** "
echo " "
echo "L\'installation écrasera irrémédiablement "
echo "toutes les données du disque ! "
echo " "
echo "Redémarrez la machine avant 20 secondes "
echo "pour annuler l'installation ! "
sleep 20

# Configuration du réseau. Le 'hostname' n'est pas pris en compte.
# Je ne le retrouve ni dans le serveur dhcp, ni sur le nom de la machine
# installée qui s'appelle pour l'instant toujours 'kickseed'.
echo "network --bootproto dhcp --hostname=$machine --device=eth0" > /tmp/network_conf

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

# Gestion du reboot si demandé
# Permet de s'adapter au type de la machine, certaines sachant
# booter temporairement sur le réseau (et donc redémarrer
# sur le disque), d'autres pas.
if [ "$reboot" = "oui" ]; then
  echo "reboot" > /tmp/reboot_conf
fi

# Mise en place de l'auto-login. Déjà beaucoup de temps passé pour
# obtenir la bonne syntaxe et encore un soucis. Je retrouve bien la
# ligne comme elle devrait être dans les logs ('/\[daemon\]/a\\nAuto...)
# mais les '\' semblent être encore interprétés une fois ce qui casse
# l'expression et donne un résultat qui ne convient pas. :-(
echo "sed -i '/\\[daemon\\]/a\\\\\\\\nAutomaticLoginEnable=true\\\\n\\\\nAutomaticLogin=$login\\\\n' /target/etc/gdm/gdm.conf-custom" > /tmp/autologin_conf

# Configuration de ssmtp
# Cette configuration fonctionne bien une fois la machine
# redémarrée, mais pas en mode '--nochroot' puisque le
# système en place pour l'installation n'utilise ni 'mail' ni
# 'ssmtp'. A suivre.
cat > /tmp/ssmtp_conf << eof
root=$login@mon_domaine.com
mailhub=mon_serveur_mail_local
rewriteDomain=mon_domaine.com
hostname=$machine
FromLineOverride=YES
eof

# L'intérêt d'utiliser '--nochroot' est de conserver
# l'accès au système d'installation, et par là même
# aux fichier préparés dans /tmp, le système installé
# se trouvant alors sous '/target'. Le (petit) inconvénient
# est que l'on ne peut pas profiter pleinement des paquets
# installés sur le nouveau système (voir ci-dessus le pb
# avec ssmpt).
%post --nochroot

# Changement de serveur du temps
sed -i 's/server ntp.ubuntu.com/server mon_serveur_local/g' /target/etc/ntp.conf

# Mise en place de l'auto-login
%include /tmp/autologin_conf

# Mise en place du fichier de configuration de ssmtp
mv /tmp/ssmtp_conf /target/etc/ssmtp/ssmtp.conf

Voilà. Si quelqu'un a donc des idées pour :
-la demande de confirmation
-le nom de machine
-la mise en place de l'auto-login
-l'envoi d'un mail en fin d'installation
je serais bien volontiers preneur (et d'autres sans doute aussi smile).

Dernière modification par m2nis (Le 18/12/2008, à 08:09)


Michaël.

Hors ligne

#3 Le 19/12/2008, à 10:13

m2nis

Re : Installation automatisée de (U|Ku|Xu)buntu en réseau avec Kickstart

Allez ! Je continue mon monologue ! smile

m2nis a écrit :

-l'envoi d'un mail en fin d'installation

Pour ça, l'installation #27 m'a permis de le régler. big_smile

En fait, c'est assez simple (comme toujours smile). L'option --nochroot permet de conserver le système d'installation, mais n'interdit pas d'utiliser chroot pour profiter également du système installé. L'envoi du mail tient donc en une seule ligne:

# Envoi d'un mail de fin d'installation
chroot /target echo "Fin d'installation de la machine" | chroot /target mail -s "Fin d'installation de $machine" monmail@mondomaine.com

Autre bonne nouvelle : il me semble (et cela parait logique) que l'utilisation de --nochroot permet de continuer à avoir accès aux variables qui ont été définies via la cmdline, ce qui simplifie un peu les choses.

Néanmoins, je reste preneur de :
-la demande de confirmation
-le nom de machine
-la mise en place de l'auto-login


Michaël.

Hors ligne

#4 Le 19/12/2008, à 15:31

m2nis

Re : Installation automatisée de (U|Ku|Xu)buntu en réseau avec Kickstart

En attendant la fin de l'install #32 smile, un petit point résolu complémentaire :

-la suppression des paquets fonctionne enfin. Il suffit, dans %post, de mettre par exemple :

# Suppression des paquets non souhaités
chroot /target apt-get -y remove abiword-common

Le '-y' permet de valider la suppression en répondant 'oui' à toutes les questions, le choix de 'abiword-common' plutôt que 'abiword' permet de l'enlever plus complètement puisque apt-get gère les dépendances (on peut supprimer abiword sans supprimer abiword-common, pas l'inverse).


Michaël.

Hors ligne

#5 Le 19/12/2008, à 16:38

m2nis

Re : Installation automatisée de (U|Ku|Xu)buntu en réseau avec Kickstart

Grosse galère pour trouver la bonne syntaxe de ça (sauf que 'ça' ne fonctionne pas smile) :

chroot /target sed -i '/\[daemon\]/a\\nAutomaticLoginEnable=true\n\nAutomaticLogin=$login\n' /etc/gdm/gdm.conf-custom

où je voudrait que $login soit remplacé par sa valeur, mais que le reste (et en particulier les backslash) soit conservé.

Objectif (au cas où il y aurait une méthode plus simple) : ajouter au fichier /etc/gdm/gdm.conf-custom (après l'étiquette '[daemon]') les informations nécessaires à l'auto-login.


Michaël.

Hors ligne

#6 Le 19/12/2008, à 17:28

m2nis

Re : Installation automatisée de (U|Ku|Xu)buntu en réseau avec Kickstart

[monologue - suite] smile

Visiblement, le remplacement de ' par " doit suffire.

chroot /target sed -i "/\[daemon\]/a\\nAutomaticLoginEnable=true\n\nAutomaticLogin=$login\n" /etc/gdm/gdm.conf-custom

Je l'avais bien testé il me semble, mais avant de voir un autre problème : les variables non définies dans la commande d'appel sont mise à une valeur par défaut dans le script, mais ne sont alors pas accessibles dans la section %post. Est-ce qu'un 'export' pourrait pouvoir régler le problème ? A vérifier.

Dernière modification par m2nis (Le 19/12/2008, à 17:32)


Michaël.

Hors ligne

#7 Le 22/12/2008, à 07:59

m2nis

Re : Installation automatisée de (U|Ku|Xu)buntu en réseau avec Kickstart

Visiblement, le remplacement de ' par " doit suffire.

Non, cela ne suffit pas puisque le backslash est un caractère particulier. J'ai fini par y arriver, mais... le compte de backslash pour arriver au final à 2 successifs me surprend un peu: il m'en a fallu 16. Je n'ai pas essayé autre chose entre 8 et 16, mais 8 n'est pas assez et 16 pas trop. smile Il doit cependant y avoir une solution d'écriture plus simple, mais je n'ai pas encore trouver... En tous les cas, voici la ligne qui change tout :

chroot /target sed -i "/\\\\[daemon\\\\]/a\\\\\\\\\\\\\\\\nAutomaticLoginEnable=true\\\\n\\\\nAutomaticLogin=$login" /etc/gdm/gdm.conf-custom

Pour ce qui est de la configuration de X, la ligne "xconfig --depth=32 ..." ne sert à rien. D'après les logs, XFCE n'est pas pris en compte, la résolution ne l'est clairement pas non plus et le changement de la ligne pour 'skipx' donne exactement le même résultat. Ce sera donc 'skipx'. smile

En ce qui concerne les variables non définies dans la cmdline, l'export ne change rien.
Ni
export utilisateur="Test"
ni
utilisateur="Test"
export utilisateur
ne donne de résultat.

En ce qui concerne la configuration de Vino, ces deux lignes :

chroot /target gconftool-2 -s -t string /desktop/gnome/remote_access/vnc_password dGVzdA==
chroot /target gconftool-2 -s -t bool /desktop/gnome/remote_access/enabled true

ne fonctionnent pas. Lorsqu'elles étaient inversées, je trouvais bien un message d'erreur pour 'enable true' car aucun mot de passe n'était défini, mais depuis que j'ai changé l'ordre, plus rien. Plus de trace dans les logs, mais ça ne fonctionne pas pour autant. J'ai mis un petit 'echo' avant et après ces deux lignes que je retrouve bien, mais... rien. ???

Enfin, à supposer que cette configuration fonctionnerait, il faut encore ajouter le fichier de lancement. J'avais choisi l'option 'graphique' que l'on retrouve dans le panneau XFCE sous la rubrique 'démarrage'. Pour cela, il faut ajouter un fichier normé au répertoire .config/autostart du home.
Mon problème : cette opération a beau être en presque fin de section %post, le user n'est pas encore créé. Donc pas de répertoire non plus... Je sens que le passage par init.d va être incontournable...

Voilà. Enfin, si quelques uns des lecteurs avait quelques lumières à apporter, cela me comblerait. smile


Michaël.

Hors ligne

#8 Le 22/12/2008, à 08:03

m2nis

Re : Installation automatisée de (U|Ku|Xu)buntu en réseau avec Kickstart

Le temps de l'écrire et...

Si le user n'est pas encore créé, il est vraisemblable que la configuration de Vino pour ce même user ne risque pas de fonctionner.

Je sens qu'il va falloir creuser le '@reboot' aperçu dans les options de cron, en espérant que la version présente dans Ubuntu sait le gérer...


Michaël.

Hors ligne

#9 Le 22/12/2008, à 10:53

seb24

Re : Installation automatisée de (U|Ku|Xu)buntu en réseau avec Kickstart

Je m'abonne a ce sujet. Y'a que Kickstart qui permet ce genre de manip ? J'avais lu que Mandriva avait sortie aussi un systeme plus complet pour la gestion de parc info ?


Mini PC NUC avec Ubuntu: ebay

Hors ligne

#10 Le 22/12/2008, à 11:15

m2nis

Re : Installation automatisée de (U|Ku|Xu)buntu en réseau avec Kickstart

seb24 a écrit :

Y'a que Kickstart qui permet ce genre de manip ?

Non, il y a au moins preseed aussi. Si je ne dis pas de bêtise, kickstart est d'origine Redhat, preseed d'origine Debian. Il me semble avoir aperçu encore d'autres petites chose. Kickstart m'a séduit au premier abord par sa simplicité et par le fait qu'il existe sous plusieurs systèmes. Mais le fait est que j'ai du m'intéresser quand même (mais de loin) à preseed pour réussir à faire ce que je voulais.

En tous les cas, les seules vraies limites que j'ai trouvé pour l'instant avec Kickstart sont... les miennes ! big_smile


Michaël.

Hors ligne

#11 Le 22/12/2008, à 11:53

m2nis

Re : Installation automatisée de (U|Ku|Xu)buntu en réseau avec Kickstart

Concernant le nom de la machine, le problème est résolu en renommant la machine en fin d'installation. Soit l'ajout de :

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

dans la section %post.


Michaël.

Hors ligne

#12 Le 22/12/2008, à 13:22

Sagittarus

Re : Installation automatisée de (U|Ku|Xu)buntu en réseau avec Kickstart

bonjour,

je m'abonne aussi.

il y a au moins preseed aussi

Je confirme, car j'ai commencé un travail d'installation automatisée sous Debian : on jette le cédérom et , si on explicite pas la ligne de commande, ça installe avec les paramètres indiqués dans ... preseed.
Mon but était/est de pouvoir ré-installer une machine rien qu'en jettant le cédérom dedans, avec possibilité de créer des profils type et/ou de poser juste les questions qui vont bien (genre : nom de machine et adrs IP tongue )
J'ai lâcher l'affaire par fainéantise dès que ça a fonctionné...

Dernière modification par Sagittarus (Le 22/12/2008, à 13:23)


E PLURIBUS UNUM
3 postes Ubuntu / 1 poste XP / 1 serveur Debian / et un portable XP-Ubuntu

Hors ligne

#13 Le 22/12/2008, à 15:06

m2nis

Re : Installation automatisée de (U|Ku|Xu)buntu en réseau avec Kickstart

Petit ajout côté réseau (je donne au fur et à mesure smile) : la machine ne présente pas son nom au serveur dhcp dans la configuration de l'installation (alors que ce n'est pas le cas avec une installation "standard" cdrom). Une seule ligne dans %post suffit pour corriger le problème.

sed -i '1i\send host-name "<hostname>";' /target/etc/dhcp3/dhclient.conf

Pour le reste, si quelqu'un a une explication (et une solution) au fait que les variables passées dans cmdline sont accessibles et dans %pre et dans %post alors que celles définies dans %pre ne sont pas accessibles dans %post, je suis preneur. C'est mon blocage du moment. wink


Michaël.

Hors ligne

#14 Le 22/12/2008, à 18:24

m2nis

Re : Installation automatisée de (U|Ku|Xu)buntu en réseau avec Kickstart

Bon. Voici une évolution assez avancée de mon script. Certains problèmes persistent, mais il contient, il me semble, largement tout ce qu'il faut pour pouvoir aller plus loin ensuite.

Par rapport aux versions présentées ci-dessus, l'apport essentiel tourne autour de la configuration de Vino (prise de contrôle). Mais les techniques utilisées peuvent servir à bien d'autres choses. L'idée utilisée pour Vino : puisque certaines choses ne sont pas encore en place (liées à l'utilisateur en particulier) au moment de l'exécution de %post, je vais créer un fichier script qui sera exécuté... au reboot de la machine, après l'installation. Pour l'essentiel, cela fonctionne (enfin), et... c'est une bonne nouvelle ! smile

Ce qui ne fonctionne (toujours) pas:
-les variables non définies dans cmdline (voir plus haut). HELP ! smile
-dans la configuration de Vino, le mot de passe est bien pris en compte, mais la case correspondante en mode graphique (L'utilisateur doit saisir son mot de passe) n'est pas cochée. Résultat, la prise de contrôle se fait aucune demande de mot de passe. Gênant.
-l'effacement de la commande @reboot du cron et du fichier tempcron. Pas encore cherché pourquoi (droits ?).
-l'effacement du script de fin d'install par lui-même. Pas encore cherché.

Bonne découverte.

# Script Kickstart pour installation automatisée
# de (U|Xu|Ku)buntu 8.04 LTS par le réseau
# Squelette généré par Kickstart Configurator
# platform=x86
#
# 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)
#    = "temp" si non fourni
#  mdp_vino=mot_de_passe_prise_de_controle (facultatif)
#    = $mdp si non fourni
#  reboot=oui (facultatif)
#    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_oss

# 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

# 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

# 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

# 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

# Configuration du système X Window
# Ne fonctionne pas - Xfce uniquement ?
#xconfig --depth=32 --resolution=1280x1024 --defaultdesktop=XFCE --startxonboot

# Acceptation de la license Java
preseed --owner sun-java5-bin shared/accepted-sun-dlj-v1-1 boolean true

# Installation des paquets supplémentaires
%packages --resolvedeps
# ici, choix de xubuntu-desktop, mais ubuntu-desktop
# ou kubuntu-desktop devrait fonctionner
xubuntu-desktop
evince
mailx
msttcorefonts
ntp
numlockx
ocsinventory-agent
openoffice.org
openoffice.org-gtk
smbfs
ssmtp
sun-java5-jre
sun-java5-plugin
vino

%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="temp"
fi

if [ -z "$mdp_vino" ]; then
	mdp_vino=$mdp
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 "    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

# Préparation de la configuration réseau
# paramètre '--hostname=" ne fonctionne pas
echo "network --bootproto dhcp --device=eth0" > /tmp/network_conf

# 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

# Configuration de ssmtp
cat > /tmp/ssmtp_conf << eof
root=$login@mon_domaine.com
mailhub=mon_serveur_local
rewriteDomain=mon_domaine.com
hostname=$machine
FromLineOverride=YES
eof

%post --nochroot

# Changement de serveur du temps
sed -i 's/server ntp.ubuntu.com/server mon_serveur_local/g' /target/etc/ntp.conf

# Mise en place de l'auto-login
chroot /target sed -i "/\\\\[daemon\\\\]/a\\\\\\\\\\\\\\\\nAutomaticLoginEnable=true\\\\n\\\\nAutomaticLogin=$login" /etc/gdm/gdm.conf-custom

# Mise en place du fichier de configuration de ssmtp
mv /tmp/ssmtp_conf /target/etc/ssmtp/ssmtp.conf

# Suppression des paquets non souhaités
chroot /target apt-get -y remove abiword-common
chroot /target apt-get -y remove gnome-games 
chroot /target apt-get -y remove gnumeric-common
chroot /target apt-get -y remove pidgin
chroot /target apt-get -y remove transmission-common

#--------------------------------------------
# Préparation du script de fin d'installation
# Ce script sera exécuté au premier
# redémarrage de la machine
#--------------------------------------------
cat > /target/usr/bin/fin_install << eof
# 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 string /desktop/gnome/remote_access/authentification_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
ls /home/$login
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=
Exec=/usr/lib/vino/vino-server
StartupNotify=false
Terminal=false
Hidden=false
eof

echo "eof" >> /target/usr/bin/fin_install

cat >> /target/usr/bin/fin_install << eof
# Effacement du script de fin d'installation dans cron
sudo crontab -l > /usr/bin/tempcron
sudo sed -i '/^@reboot su/d' /usr/bin/tempcron
sudo crontab /usr/bin/tempcron
#
# Effacement du script de modification de cron
sudo rm /usr/bin/tempcron 
eof 
#------------------------------------
# Fin du script de fin d'installation
#------------------------------------

# Changement des droits du script final
chmod 777 /target/usr/bin/fin_install

# Insertion du script final dans cron
chroot /target crontab -l > /target/usr/bin/tempcron
chroot /target echo "@reboot su - $login -c /usr/bin/fin_install" >> /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
sed -i '1i\send host-name "<hostname>";' /target/etc/dhcp3/dhclient.conf

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

Michaël.

Hors ligne

#15 Le 23/12/2008, à 17:50

m2nis

Re : Installation automatisée de (U|Ku|Xu)buntu en réseau avec Kickstart

m2nis a écrit :

-l'effacement de la commande @reboot du cron et du fichier tempcron. Pas encore cherché pourquoi (droits ?).

Finalement, je suis passé par la création de deux scripts au lieu d'un, l'un exécuté en root et appelant l'autre en usager. Soit :

#----------------------------------------------
# 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'
cat > /target/usr/bin/fin_install_user << eof
# 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 string /desktop/gnome/remote_access/authentification_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

# Création du fichier 'root'
cat > /target/usr/bin/fin_install_root << eof
# 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 su/d' /usr/bin/tempcron
crontab /usr/bin/tempcron
# Effacement du script de modification de cron
rm /usr/bin/tempcron 
eof 
#------------------------------------
# Fin du script de fin d'installation
#------------------------------------

Et l'appel se fait donc par :

# 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

Par ailleurs, j'essaye également d'ajouter une tache cron pour le lancement d'un script de sauvegarde. Pour le lancer entre 9h et 16h, j'ai écrit ce petit morceau de script :

# Génération d'une heure aléatoire entre (approximativement) 9h et 15h59
heure=$(echo "scale=0;($RANDOM/4700)+9" | bc)
minute=$(echo "scale=0;($RANDOM/550)" | bc)
echo "$minute $heure * * * /usr/bin/$sauve_sh start" >> /usr/bin/tempcron

Ce code fonctionne très bien en mode 'bash', mais pas en 'sh'. Quelqu'un connaîtrait-il l'équivalent des fonctions en 'sh' ?

D'avance merci.


Michaël.

Hors ligne

#16 Le 24/12/2008, à 10:21

m2nis

Re : Installation automatisée de (U|Ku|Xu)buntu en réseau avec Kickstart

Concernant le script de génération d'une heure aléatoire, il suffit tout simplement d'ajouter #!/bin/bash aux scripts exécutés au redémarrage et de protéger les '$' pour qu'ils ne soient pas interprétés à la création du script. Faut pas chercher trop loin parfois... roll

En tous les cas, il ne semble pas y avoir grand monde dans ce fil... big_smile

Concernant le problème d'authentification de Vino, c'est l'utilisation d'un mauvais mot associée à un mauvais type de donnée qui générait le dysfonctionnement. Il fallait mettre:

gconftool-2 -s -t list --list-type string /desktop/gnome/remote_access/authentication_methods '[vnc]'

et non pas '-t string' et 'authentification' (merci gconf-editor qui permet de voir les clés existantes ! smile).


Michaël.

Hors ligne

#17 Le 26/12/2008, à 22:59

Sagittarus

Re : Installation automatisée de (U|Ku|Xu)buntu en réseau avec Kickstart

bonsoir,

# Mise à jour régulière de la liste des paquets (via la crontab)
echo "0    3    *    *    *    apt-get -y update" >> /var/spool/cron/crontabs/root
# Ici : tous les jours à 03h00

sauf si vous tenez a utiliser les variables (?) pour lancer vos scripts a des heures différentes

edit : /var/spool/cron/crontabs/root c'est pour Debian, ne changez pas votre destination.
Le but est de vérifier que la syntaxe des variables est (ou pas) la cause du pb.

Dernière modification par Sagittarus (Le 26/12/2008, à 23:05)


E PLURIBUS UNUM
3 postes Ubuntu / 1 poste XP / 1 serveur Debian / et un portable XP-Ubuntu

Hors ligne

#18 Le 27/12/2008, à 10:44

m2nis

Re : Installation automatisée de (U|Ku|Xu)buntu en réseau avec Kickstart

Sagittarus a écrit :

sauf si vous tenez a utiliser les variables (?)

L'intérêt de l'heure variable pour la sauvegarde est de répartir la charge dans le temps pour le serveur et pour le réseau.


Michaël.

Hors ligne

#19 Le 28/12/2008, à 14:00

Sagittarus

Re : Installation automatisée de (U|Ku|Xu)buntu en réseau avec Kickstart

bonjour,

répartir la charge dans le temps pour le serveur et pour le réseau

de mon coté je fais les sauvegardes d'une façon plus classique : la nuit, en sauvegardant d'un bloc tout ce qui doit l'être, ce qui évite également le soucis des verrouillage de fichiers...

Mais bon, pour revenir au soucis initial, sachez que la syntaxe me paraît bonne et qu'à priori seul l'usage des variables pourrait justifier l'inopérabilité du script.


E PLURIBUS UNUM
3 postes Ubuntu / 1 poste XP / 1 serveur Debian / et un portable XP-Ubuntu

Hors ligne

#20 Le 28/12/2008, à 21:03

m2nis

Re : Installation automatisée de (U|Ku|Xu)buntu en réseau avec Kickstart

Sagittarus a écrit :

de mon coté je fais les sauvegardes d'une façon plus classique : la nuit, en sauvegardant d'un bloc tout ce qui doit l'être, ce qui évite également le soucis des verrouillage de fichiers...

C'est parfait pour les serveurs qui tournent non stop, mais pas pour les postes bureautique qui sont coupés tous les soirs.

Sagittarus a écrit :

Mais bon, pour revenir au soucis initial, sachez que la syntaxe me paraît bonne et qu'à priori seul l'usage des variables pourrait justifier l'inopérabilité du script.

Non non, comme je l'ai écrit, le script fonctionne maintenant parfaitement. Les variables ne sont utilisées qu'une seule fois pour l'ajout du script dans cron. Chaque machine a donc une heure choisie aléatoirement mais qui n'est générée qu'une seule fois au moment de l'installation et qui restera donc fixe pour une machine donnée.


Michaël.

Hors ligne

#21 Le 28/12/2008, à 22:42

Sagittarus

Re : Installation automatisée de (U|Ku|Xu)buntu en réseau avec Kickstart

bonsoir,

alors autant pour moi tongue

Cette période festive peut me couvrir d'excuses pour mes lectures peu attentives lol

Je me replongerai moi-meme dans ces histoires d'installation automatisée (avec une 8.04 également), et pour info, j'utilise un serveur Debian dédié offrant le DHCP et le DNS.
Du coup, dans le DHCP je n'indique pas les adresses IP fixes, mais les noms de machines...
Ce qui permet, par exemple, de modifier UNIQUEMENT dans le fichier DNS (.host et .rev) l'adresse de la machine et "tout suit derrière"...

a+


E PLURIBUS UNUM
3 postes Ubuntu / 1 poste XP / 1 serveur Debian / et un portable XP-Ubuntu

Hors ligne

#22 Le 12/01/2009, à 17:54

m2nis

Re : Installation automatisée de (U|Ku|Xu)buntu en réseau avec Kickstart

Toujours personne pour m'aider à trouver comment définir une variable dans 'pre' qui soit utilisable dans 'post' ? C'est mon dernier point de blocage important...


Michaël.

Hors ligne

#23 Le 12/01/2009, à 18:15

Sagittarus

Re : Installation automatisée de (U|Ku|Xu)buntu en réseau avec Kickstart

bonjour,

je comprends pas trop ce qui vous bloque...ne pouvez vous pas créer une variable permanente ?
mavariable="unevaleur"
export mavariable

ou directement : export mavariable="unevaleur"

Note : éventuellement mettez "#!/bin/bash" en tete de votre script ".sh"

Mais j'ai peut-être mal suivi l'affaire


E PLURIBUS UNUM
3 postes Ubuntu / 1 poste XP / 1 serveur Debian / et un portable XP-Ubuntu

Hors ligne

#24 Le 12/01/2009, à 18:33

m2nis

Re : Installation automatisée de (U|Ku|Xu)buntu en réseau avec Kickstart

Sagittarus a écrit :

je comprends pas trop ce qui vous bloque...ne pouvez vous pas créer une variable permanente ?
mavariable="unevaleur"
export mavariable

ou directement : export mavariable="unevaleur"

Non. Comme je l'ai écrit un peu plus haut :

En ce qui concerne les variables non définies dans la cmdline, l'export ne change rien.
Ni
export utilisateur="Test"
ni
utilisateur="Test"
export utilisateur
ne donne de résultat.

J'arrive à définir une variable dans 'pre' et à l'utiliser dans 'pre', mais pas dans 'post'. Pourtant, le fait que 'post' soit en 'nochroot' devrait faciliter l'opération. Là, il y a sûrement des connaissances système qui me manquent... D'où mon appel à l'aide d'ailleurs... smile


Michaël.

Hors ligne

#25 Le 12/01/2009, à 18:40

m2nis

Re : Installation automatisée de (U|Ku|Xu)buntu en réseau avec Kickstart

Visiblement, il est "normal" que cela ne fonctionne pas :

%pre scripts are run in a subshell, so it's not possible for exported shell variables to be passed back to the rest of the installer from there.

Il va donc falloir trouver un autre moyen...


Michaël.

Hors ligne