2 votes

Kickstart CentOS 7 avec une IP statique et un nom d'hôte prédéfinis (%pre) et utilisés dans KS, possible ?

Je ne sais pas si c'est possible, mais je vais quand même demander.

Je suis en train d'essayer de donner un coup de pouce à nos nouveaux serveurs avec CentOS 7. Jusqu'à présent, j'ai réussi à faire fonctionner la plupart des choses, mais pour une raison quelconque, si j'utilise des variables dans la section %pre de mon script de Kickstart, elles ne sont pas du tout analysées dans la configuration. Je commence donc à penser que ce n'est même pas possible ?

C'est ce que j'ai dans la section %pre de mon Kickstart :

%pre --log /tmp/pre-install.log

hostname=serverA120
ip=100.110.120.130
IFS=. read ip1 ip2 ip3 ip4 <<< "$ip"

Ensuite, pendant le Kickstart, il doit utiliser les informations remplies ci-dessus :

network  --bootproto=static --device=eth0 --gateway=100.110.$ip3.1 --ip=$ip --nameserver=1.1.1.1 --netmask=255.255.255.0
network  --hostname=$hostname.example.com

Et dans la section %post, j'essaie également d'utiliser les variables de %pre :

sed -i'' -e '/HOSTNAME=/d' /etc/sysconfig/network
echo HOSTNAME=$hostname.example.com >> /etc/sysconfig/network
echo GATEWAY=100.110.$ip3.1 >> /etc/sysconfig/network

echo BOOTPROTO=static >> /etc/sysconfig/network-scripts/ifcfg-eth0
echo IPADDR=$ip >> /etc/sysconfig/network-scripts/ifcfg-eth0
echo NETMASK=255.255.255.0 >> /etc/sysconfig/network-scripts/ifcfg-eth0
echo BROADCAST=100.110.$ip3.255 >> /etc/sysconfig/network-scripts/ifcfg-eth0
echo NETWORK=100.110.$ip3.0 >> /etc/sysconfig/network-scripts/ifcfg-eth0
echo GATEWAY=100.110.$ip3.1  >> /etc/sysconfig/network-scripts/ifcfg-eth0

echo $hostname.example.com >> /etc/hostname
sudo hostnamectl set-hostname $hostname.example.com

J'ai vérifié l'ifcfg-eth0 physiquement après que je ne pouvais plus atteindre le serveur et il a montré ce qui suit :

IPADDR=
BROADCAST=100.110..255
NETWORK=100.110..0
GATEWAY=100.110..1

J'ai également vérifié /etc/hostname :

$hostname.example.com

Donc les variables ne sont pas analysées dans le Kickstart. Est-ce que je fais quelque chose de mal ou est-ce que ce n'est tout simplement pas possible ? Existe-t-il une solution alternative à ce problème ?

Bien sûr, je peux ajuster manuellement toutes les lignes avant et après, mais je voulais rendre cela aussi facile que possible sans avoir à tout modifier manuellement. En d'autres termes, je veux juste remplir 2 lignes et le reste est configuré comme je le souhaite. Cela rendrait les choses plus faciles avec le Kickstarting de plusieurs serveurs sur le long terme.

Je n'ai aucune idée de ce que je fais de mal, mais en vérifiant ifcfg-eth0 et hostname, il est clair que les variables pré-entrées ne sont pas utilisées ? Mais comme je l'ai dit plus haut, peut-être que ce n'est tout simplement pas possible, ou que je ne l'utilise pas correctement.

Et non, je ne veux pas utiliser le DHCP ou autre. Parce que je dois toujours le changer manuellement par la suite. Je veux juste remplir les deux premières lignes dans %pre (hostname et ip) et qu'elles soient utilisées automatiquement pendant l'installation complète (et dans %post).

1voto

MatteoBee Points 116

Vous ne pouvez pas utiliser les variables d'un bloc avec un autre car il s'agit de scripts distincts exécutés à des moments différents ; Ces sections de code seront divisées et placées dans des fichiers distincts uniques et ensuite exécutées (pas même) dans l'ordre où vous les écrivez, ce qui signifie que si vous avez 3 sections %pre, elles ne seront pas nécessairement exécutées dans l'ordre, alors tenez-en compte. De plus, vous ne pouvez pas utiliser ces variables avec une autre section du kickstart.

Une idée serait d'utiliser des fichiers satellites où conserver vos données (comme vous écrivez un fichier /tmp/file dans votre %pre et ensuite le remettre dans votre %post ... que vous pouvez faire)

J'ai pris une autre voie, j'ai littéralement créé un leurre complet pour anaconda qui me permet de placer un faux kickstart sur le disque, et ensuite d'exécuter un script à la place pour substituer des variables dans des éléments comme %%IP%% ou %%HOSTNAME%% avec un sed.

De toute façon, vous n'avez pas besoin de faire tout cela, vous pouvez simplement placer le paramètre de ip1 ip2 ip3 ip4 en haut de votre %post de cette façon, tu auras les variables définies.

alors vous pouvez simplement écrire vos fichiers comme vous le faisiez auparavant dans votre bloc post.

Sautez les lignes "réseau" dans le kickstart et utilisez simplement network --activate [--device=DEVICENAME] (Ajoutez --device si vous en avez plusieurs et que vous voulez n'en utiliser qu'un)

Ce qui suit est juste pour votre information :

en utilisant %pre %post vous n'avez pas accès à BASH, c'est juste Bourne Shell.

le kickstart vous permet d'utiliser "--interpreter=/bin/bash" dans votre ligne %pre/%post mais après des tests approfondis dans le passé, j'ai constaté que cela ne fonctionne pas toujours, donc généralement j'ajoute le shebang à la première ligne du bloc.

    %post --log=/root/post.log
    #!/bin/bash
    ##
    [... code ...]
    %end

cela devrait vous permettre d'utiliser BASH au lieu de Bourne Shell.

1voto

J'utilise quelque chose de similaire pour obtenir les paramètres dhcp. Je suppose que vous pouvez prendre quelques mesures supplémentaires pour obtenir une adresse IP statique.

%pre
echo "network  --bootproto=dhcp --device=eth0 --ipv6=auto --activate --hostname renameme.ipa.smith122.com" > /tmp/network.ks
for x in $( cat /proc/cmdline );
do
   case $x in
      SERVERNAME*)
         eval $x
         echo "network  --bootproto=dhcp --device=eth0 --ipv6=auto --activate --hostname ${SERVERNAME}.ipa.example.com" > /tmp/network.ks
         ;;
      NOTIFYEMAIL*)
         eval $x
         echo "${NOTIFYEMAIL}" > /mnt/sysroot/root/notifyemail.txt
         ;;
   esac
done

Et puis en dehors des %pre et %post, juste en général dans le fichier, vous avez besoin :

%include /tmp/network.ks

Pour vous, vous voudriez probablement une ligne ressemblant à :

network --bootproto=static --ip=10.0.2.15 --netmask=255.255.255.0 --gateway=10.0.2.254 --nameserver=10.0.2.1

Références

  1. https://sysadmin.compxtreme.ro/automatically-set-the-hostname-during-kickstart-installation/
  2. Mon propre article de blog : https://bgstack15.wordpress.com/2019/07/25/use-virt-install-to-fully-automate-the-install-for-centos-fedora-with-kickstart/
  3. https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/installation_guide/s1-kickstart2-options trouvé par une recherche sur Internet pour kickstart network

1voto

tlum Points 257

Bien que la réponse acceptée soit généralement correcte et qu'elle explique bien ce qui se passe, j'ai pensé que je pourrais apporter quelques éclaircissements qui manquent et montrer une variante de mise en œuvre réelle que j'utilise et qui démontre certaines de ces choses.

Tout d'abord, insistons sur le point des "variables". Le site %pre et %post Les blocs sont simplement des enveloppes autour d'un code arbitraire qui n'a aucune signification pour l'installateur. Il considère tout ce qui se trouve dans ces blocs comme un simple texte qui est transmis au programme d'installation. --interpreter . En fait, vous pourriez utiliser %pre --interpreter=/bin/sh et %post --interpreter=/usr/bin/python Dans ce cas, les variables des deux blocs ne seraient même pas syntaxiquement compatibles. Ainsi, la variable "scope" est d'abord locale à un bloc de type %pre/%post à tout le moins, puis serait encore plus restreint selon les règles de "portée" de la langue spécifiées par l'équipe de l --interpreter option.

Maintenant, un point important que la réponse acceptée n'a pas abordé est le %pre est exécuté dans l'environnement d'installation. L'environnement d'installation est comme un live-cd

  • Il utilise un système de fichiers résidant en mémoire vive.
  • Vous n'avez accès qu'aux commandes et aux utilitaires qui sont inclus dans le système de fichiers de l'installateur.
  • Les dispositifs et leurs noms dans l'environnement "install" peuvent différer de ceux de l'environnement "installé".

Par exemple, cette %pre --log /tmp/pre-install.log peut ne pas faire ce que vous attendez. Si l'installation échoue pour une raison quelconque avant que l'installateur ne démarre dans la nouvelle installation, vous pouvez utiliser l'installateur Shell pour cat ce fichier. Mais une fois le redémarrage effectué, tout ce qui a été écrit dans le système de fichiers de l'installateur temporaire sera perdu.

De plus, c'est techniquement incorrect :

Une idée serait d'utiliser des fichiers satellites où conserver vos données (comme vous écrivez un fichier /tmp/f dans votre %pre et le récupérez ensuite dans votre %post... que vous pouvez faire)

Tu pourrais le faire, mais seulement si vous l'écrivez sur un système de fichiers qui persistera à travers les redémarrages, comme un montage USB, iSCSI, NFS, CIFS, etc.

Dans cette optique, suivez le principe KISS (Keep It Simple...) lorsqu'il s'agit de l'élaboration de la politique de l'entreprise. %pre sélection. Il se peut que vous n'ayez pas accès aux commandes/outils/langues les plus avancés ; cela dépendra de ce qui se trouve ou non dans le paquet d'installation et les différentes distros et versions peuvent modifier cela au fil du temps.

A l'inverse, vous avez carte blanche dans le domaine de la santé. %post puisque, à ce moment-là, vous aurez accès à tout ce que vous avez spécifié dans le bloc %packages bloc.

Bien que vous vouliez garder le %pre est simple en termes d'outils et de langages utilisés, plus vous configurez le système à l'aide des commandes de l'installateur, moins vous serez contraint de "patcher" la configuration dans le système d'exploitation. %post bloc.


Exemple de travail - Variation

Lorsque je provisionne de nouveaux hôtes, je commence par collecter et/ou générer trois éléments (dans le cadre de cet exemple) : l'adresse MAC, l'adresse IP et le nom de l'hôte. Si je dispose d'un grand nombre de ces éléments, ils sont généralement placés dans une feuille de calcul de configuration. L'étape suivante consiste à créer des réservations dans le DHCP, ce qui permet de relier l'adresse MAC réelle ou virtuelle à l'adresse IP qui lui est attribuée. L'adresse IP et le nom d'hôte sont ensuite placés dans les zones de recherche directe et inverse du DNS. Vous pouvez utiliser des formules dans la feuille de calcul pour générer les entrées DHCP et DNS afin que cela devienne un exercice de découpage. Une fois le DHCP et le DNS terminés, il suffit de démarrer le boîtier en réseau pour que la configuration correcte se produise. Je trouve qu'une réservation DHCP est un petit prix à payer pour la cohérence et l'efficacité du déploiement et même du redéploiement des instances de serveur.

Voici le fichier de démarrage, qui a été réduit à un peu plus que les entrées pertinentes.

#version=RHEL8

text

%include /tmp/network.ks

eula --agreed
reboot
skipx

%pre
#!/bin/bash

DEVICE=$(ip r|grep default|grep  -oP '(?<=dev )\S*')
declare -A value
while IFS= read -r line; do
  kvp=${line##DHCP4.OPTION\[*\]:*[ ][ ]}
  value+=([${kvp% = *}]=${kvp#* = })
done <<< $(nmcli -f dhcp4 device show $DEVICE)

echo "network --device link --bootproto static --ip ${value[ip_address]} --netmask ${value[subnet_mask]} --gateway ${value[routers]} --hostname ${value[host_name]}.${value[domain_name]} --nameserver ${value[domain_name_servers]} --onboot yes --noipv6" > /tmp/network.ks

%end

%post --log=/root/install-post.log

cat << EOF >> /etc/hosts
$(hostname -i)        $(hostname -s) $(hostname -f)
EOF

%end

Puisque j'ai déjà créé une réservation DHCP pour la configuration "Statique" que je souhaite utiliser, dans le fichier %pre bloc que j'utilise nmcli pour obtenir les paramètres DHCP pertinents et les utiliser pour générer dynamiquement les network... pour que le programme d'installation l'utilise. Ce fichier généré dynamiquement est ensuite inclus dans le corps du script de kickstart.

Une chose qui peut sembler un peu confuse ici est l'utilisation de $DEVICE pour interroger le dhcp4 mais j'utilise les paramètres network --device link ... . La raison en est la différence entre les périphériques de l'installateur, qui est ce que je dois interroger, et le nom du ou des périphériques réseau dans le système installé, que je ne force pas en spécifiant le "premier lien actif" et en permettant à l'installateur de nommer les périphériques comme il l'entend. J'ai eu des problèmes dans le passé en supposant que le nom actif dans l'environnement de l'installateur sera le même dans l'environnement installé... et ensuite les choses ont dérapé.

Dans le %post bloquez-moi une chose dont j'ai besoin et qui n'est pas faite par le network... ajoutez l'IP et le nom d'hôte au fichier hosts. Si toutes les étapes précédentes ont configuré le système correctement au moment où la commande %post s'exécute, vous pouvez saisir tout ce dont vous avez besoin directement à partir de la configuration en cours d'exécution... vous n'avez pas besoin de faire persister l'une ou l'autre des informations de la configuration. %pre puisque le système fonctionnera sur elles à ce stade.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X