Forum Linux.général iPXE: multiple fichiers de configuration ?

Posté par  . Licence CC By‑SA.
Étiquettes :
0
3
fév.
2023

Bonjour,

Cette news linuxfr présente le chargeur d’amorçage ipxe et sa documentation est présente via ce lien.

D’après ce que je lis, il est possible d’exécuter un script mais l’interpréteur est très sommaire et ne possède pas de condition if. Dommage j’en avais justement besoin !

J’utilise le serveur DHCP de OPNsense. Dans les paramètres de l’insterface où l’on veut acterver le serveur DHCP, il est possible de renseigner l’adresse d’un serveur web où récupérer un fichier ipxe :

Network booting: Set iPXE boot filename : http:///srv_conf.ipxe

Le problème est que avec cette solution on ne peux envoyer qu’un seul fichier et l’interpréteur ipxe ne gérant pas les conditions ca va être compliqué !

Quelqu’un a t il une solution pour en fonction de la machine qui « arrive » (donc de son adresse MAC) envoyer tel ou tel fichier ipxe ?

Merci.

  • # Pourquoi compliqué ?

    Posté par  (site web personnel, Mastodon) . Évalué à 5.

    Le problème est que avec cette solution on ne peux envoyer qu’un seul fichier et l’interpréteur ipxe ne gérant pas les conditions ca va être compliqué !

    Tu n'explique pas exactement en quoi ça te pose problème. Tu as besoin de quoi comme conditions ? (en langage de description algorithmique)

    Quelqu’un a t il une solution pour en fonction de la machine qui « arrive » (donc de son adresse MAC) envoyer tel ou tel fichier ipxe ?

    Tu peux appeler une URL dynamique qui se charge de faire le boulot. Le wiki donne un exemple :

    http://192.168.0.1/boot.php?mac=${net0/mac}&asset=${asset:uristring}
    

    qui va se traduire par exemple par

    http://192.168.0.1/boot.php?mac=52:54:00:12:34:56&asset=BKQ42M1
    

    et s'attend que le le site lui renvoie le script adapté avec ces paramètres

    #!ipxe
    
    set initiator-iqn iqn.2010-04.org.ipxe:BKQ42M1
    sanboot iscsi:192.168.0.20::::iqn.2010-04.org.ipxe:winxp
    

    “It is seldom that liberty of any kind is lost all at once.” ― David Hume

    • [^] # Re: Pourquoi compliqué ?

      Posté par  . Évalué à 1. Dernière modification le 05 février 2023 à 00:39.

      Merci pour la réponse.
      Effectivement, je n'ai peut être pas donné assez de contexte.

      J’essaie d'installer OpenShift/OKD sur mon serveur Proxmox.
      OpenShift se sert de RHEL CoreOS (Fedora CoreOS pour OKD) comme SE de base (il y a une nuance pour les worker mais bref).

      Il y a plusieurs manières d'installer ce SE mais j'ai choisie via pxe.
      Or en fonction du rôle de la machine virtuelle (master ou worler), les paramètres Kernel ( les fichiers "ignition" ne sont pas les mêmes.

      Grosso modo,on va avoir ça:

      kernel http://<HTTP_server>/rhcos-<version>-live-kernel-<architecture> initrd=main coreos.live.rootfs_url=http://<HTTP_server>/rhcos-<version>-live-rootfs.<architecture>.img coreos.inst.install_dev=/dev/sda coreos.inst.ignition_url=http://<HTTP_server>/<ROLE_SERVER>.ign
      initrd --name main http://<HTTP_server>/rhcos-<version>-live-initramfs.<architecture>.img
      boot
      L'idée était donc de mettre ces commandes dans un fichier, master.ipxe, worker.pxe, …
      Et en fonction de l 'adresse MAC qui fait la demande DHCP servir le fichier
      master.ipxe ou worker.ipxe

      Mon problème est que je n'ai pas compris comment faire cela avec un serveur DHCP.
      Et le mécanisme de "Dynamic scripts", notaement la notion de "asset" reste pour moi assez obscure.

      Liens:
      - https://docs.okd.io/latest/installing/installing_bare_metal/installing-bare-metal.html#installation-user-infra-machines-pxe_installing-bare-metal

      • [^] # Re: Pourquoi compliqué ?

        Posté par  (site web personnel, Mastodon) . Évalué à 3.

        le mécanisme de "Dynamic scripts", notaement la notion de "asset" reste pour moi assez obscure.

        Ça s'appelle « dynamic script » parce-que ça renvoie un contenu généré dynamiquement. Le principe est juste un que tu as un serveur web (en fait je dis ça parce-que c'est du HTTP et que l'on fait une requête GET mais il n'y a pas de page web servie, juste un fichier texte qui se trouve être un script pour IPXE) ; dans l'exemple c'est du PHP qui est supposé, mais tu peux utilisé ce que tu veux et qui est supporté par le serveur web.
        C'est toi qui choisi les paramètres que tu veux utiliser : dans l'exemple, ce sont l'identifiant de la carte réseau (la première carte) et le numéro d'identifiant constructeur du chassie (par exemple HP et Dell te le demande quand tu contactes leur support) ; mais il y a pléthore de paramètres exploitables.

        Et en fonction de l 'adresse MAC qui fait la demande DHCP servir le fichier
        master.ipxe ou worker.ipxe

        Il me semble (mais je peux me tromper et je ne fait plus d'opérationnel) qu'il y a une confusion. Ce n'est pas le service d'adressage qui fournit l'image (ce peut être sur le même serveur ce n'est pas un souci.) Mais en supposant que ce soit le cas, le fonctionnement serait le même qu'avec un script dynamique : le serveur a une base de donnée qui associe les MAC et les types d'image et tu ne gères pas ça avec des IF dans le sscript côté iPXE…

        “It is seldom that liberty of any kind is lost all at once.” ― David Hume

        • [^] # Re: Pourquoi compliqué ?

          Posté par  . Évalué à 1. Dernière modification le 06 février 2023 à 19:44.

          Que cela soit le serveur web distant qui exécute un script dans un langage interprété et qui renvoi une chaîne de caractère qui correspond à l'équivalent d'un script iPXE: je l'ai compris.

          C'est en très gros le même principe que les pages web dynamique (au contraire des statiques).

          Par contre, ce que je ne comprends pas c'est comment est générée la requête Get ?
          Dans l'exemple de la documentation mentionne

          http://192.168.0.1/boot.php?mac=`{mathjax} {net0/mac}&asset=`{asset:uristring}

          which would expand to a URL such as

          http://192.168.0.1/boot.php?mac=52:54:00:12:34:56&asset=BKQ42M1

          Quel mécanisme permet de passer du mac=${net0/mac} à mac=52:54:00:12:34:56 ?

          Dans le cas des pages web dynamique, il me semble que c'est le rôle du javascript (ou autre « technologie front-end » pressente dans le navigateur) qui s'occupe de cela. Mais dans le cas d'un simple script … je bloque!

          A la limite je comprendrais que la requête soit simplement GET http://192.168.0.1/boot.php et que cela soit le script côté serveur qui avec les librairies qui vont bien
          1) récupère l'adresse MAC de la machine qui à fait la demande
          2) Avec un select dans une base de données ou simplement avec if:

          mastersMacList=[<mac1>,<mac2>]
          workersMacList=[<mac3>,<mac3>]
              if argument1 in mastersMacList: #argument1 étant l'adresse mac récupéré avec "la lib qui va bien"
                print("#!ipxe 
                      coreos.inst.install_dev=/dev/sda coreos.inst.ignition_url=http://192.168.0.1/master.ign
                      ")
              elif argument1 in workersMacList:
                  print("#!ipxe
                      coreos.inst.install_dev=/dev/sda coreos.inst.ignition_url=http://192.168.0.1/worker.ign
                      ")
              else:
                  exit 0
          • [^] # Re: Pourquoi compliqué ?

            Posté par  (site web personnel, Mastodon) . Évalué à 2.

            Arf, j'avais mal compris ton message d'avant.

            Quel mécanisme permet de passer du mac=${net0/mac} à mac=52:54:00:12:34:56 ?

            Le truc ici, c'est qu'on est dans un script iPXE et les variables ${truc} sont bien traités par lui, comme dans

            echo Booting from ${filename}
            chain ${filename}
            

            Mais en plus il sait lancer des requêtes et donc tu peux forger une adresse avec les paramètres qu'il sait gérer.

            Dans le cas des pages web dynamique, il me semble que c'est le rôle du javascript (ou autre « technologie front-end » pressente dans le navigateur) qui s'occupe de cela. Mais dans le cas d'un simple script … je bloque!

            Javascript est du script aussi… exécuté côté client. Ici c'est le script iPXE qui est exécuté pour appeler le back-end pour récupérer son include
            Tu peux faire un appel similaire depuis ton shell, par exemple (pas besoin de navigateur ni de JS donc)

            curl "http://192.168.0.1/boot.php?mac=$(ip -o link show eth0)&arch=$(uname -m)"

            “It is seldom that liberty of any kind is lost all at once.” ― David Hume

            • [^] # Re: Pourquoi compliqué ?

              Posté par  . Évalué à 1.

              ok, donc après avoir passé un temps fou à essayer de comprendre comment configurer nginx pour qu'il puisse gérer python, je me suis rabattu sur le php.
              Je ne connais pas ce langage mais ça m’a l’aire plus simple à comprendre que rechercher comment gérer un boot.py (non je ne veux pas créer une application en python, j’en ai rien à faire de Django, webpy et autre, non je ne veux pas me servir de la librairie ‘http serveur’ de python, j’en ai déjà un…)

              bref, je me suis rendu compte que je ne savais absolument pas comment les hyperviseurs font pour générer les MAC des VM et que avec ma méthode, j’allais devoirs renseigner l’adresse MAC, 1) lors de la réservation d’ip et 2) dans le script php… Ce qui fait une fois de trop !

              Je me base donc maintenant sur le hostname.
              j’ai bricolé le boot.php suivant en me basant sur le hostname pour déterminer le rôle d’une machine, ça fonctionne… du moins avec curl !

              <?php
              $version = "37.20221127.3.0";
              $base = "http://192.168.1.100";
              
              $hostname = $_GET['hostname'];
              /*
              $macBootstrap = [''];
              $macMaster = [''];
              $macWorker = [''];
              if (in_array($mac,$macBootstrap)) {
              */
              
              //if (str_contains($hostname,'master')) { // PHP8 :(
              
              if (strpos($hostname,'master') !== false ) {
                      $role = "master";
              } elseif (strpos($hostname,'boot') !== false) {
                      $role = "boot";
              } else {
                      $role = "woker";
              }
              
              print("#!ipxe\n");
              print("kernel ${base}/fedora-coreos-${version}-live-kernel-x86_64 rd.neednet=1 console=tty0 coreos.inst=yes coreos.inst.install_dev=sda coreos.inst.ignition_url=${base}/${role}.ign\n");
              print("initrd ${base}/fedora-coreos-${version}-live-initramfs.x86_64.img\n");
              print("initrd ${base}/fedora-coreos-${version}-live-rootfs.x86_64.img\n");
              print("boot\n");
              
              ?>

              Merci pour l’aide apportée !

              Pour le reste : la suite au prochain numéro.

      • [^] # Re: Pourquoi compliqué ?

        Posté par  (site web personnel, Mastodon) . Évalué à 3.

        Vu que tu n'as que deux ou trois options, tu peux passer par le menu comme proposé dans la dépêche.

        #!ipxe
        
        menu
        item master    Master role
        item worker    Worker role
        
        choose --timeout 3000 role
        

        Ce qui te permet de ensuite d'avoir plus loin

        coreos.inst.install_dev=/dev/sda coreos.inst.ignition_url=http://<HTTP_server>/${role}.ign
        

        “It is seldom that liberty of any kind is lost all at once.” ― David Hume

        • [^] # Re: Pourquoi compliqué ?

          Posté par  . Évalué à 1. Dernière modification le 06 février 2023 à 19:48.

          Je préférerais que cela soit sans intervention manuelle.
          :)

      • [^] # Re: Pourquoi compliqué ?

        Posté par  . Évalué à 2.

        Et en fonction de l 'adresse MAC qui fait la demande DHCP servir le fichier

        La majorité des clients PXE demandent au serveur une suite de fichiers, correspondant à l'adresse MAC entière, puis l'adresse IP, puis un bout de l'adresse IP, etc… jusqu'à demander un fichier par défaut. La partie D1 de cette page l'explique bien.

        Donc sur ton serveur BOOTP/PXE tu pourrais avoir des fichiers comme :

        profil1
        profil2
        profil3
        default
        

        et faire des liens symboliques/des redirections à partir des MACs:

        01-aa-bb-cc-dd-ee-ff -> profil3
        01-aa-bb-cc-dd-ee-ff -> profil1
        etc...
        

        Peut-être que ça suffit ?

        Regarde avec ngrep le genre de requête que font les clients au moment du bootstrap.

        • [^] # Re: Pourquoi compliqué ?

          Posté par  . Évalué à 1.

          Je ne sais absolument pas comment fonctionne le serveur PXE de OPNsense.
          Dans un premier temps, je préfère me concentré sur l'option "Set iPXE boot filename:" du serveur DHCP d'OPNsense

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.