Netzwerkboot (DHCP/TFTP) für m23-Softwareverteilung

Moin zusammen,

derzeit prüfe ich, ob/wie eine Portierung des m23-Softwareverteilungssystems (m23.sf.net) auf UCS möglich ist.

Soweit ich es gesehen habe, können die Netzwerkbooteinstellungen (TFTP-Server-IP und Bootimage) nur global im Univention-DHCP-Server eingestellt werden.

Für m23 brauche ich aber die Möglichkeit, diese pro Client individuell zu setzen und wieder zu löschen.

Wie ließe sich das in UCS (auf der Kommandozeile) machen?

Für das Anlegen eines Clients habe ich das Folgende herausgefunden:

[code]client=‘testcl’
distr=‘Debian’
release=‘Wheezy’
password=‘test’
mac=‘00:11:22:33:44:55’
ip=‘192.168.1.244’

udm computers/linux create --position “cn=computers,$(ucr get ldap/base)”
–set name="$client"
–set operatingSystem="$distr"
–set operatingSystemVersion="$release"
–set mac="$mac"
–set name="$client"
–set ip="$ip"[/code]

Mit freundlichen Grüßen,
Hauke Goos-Habermann

Hallo

über Richtlinien (dhcp_boot) kann man diese Einstellungen auch für einzelne Rechner (besser gesagt für dhcp_host Objekte) vorgeben.
Das folgende Beispiel erzeugt zunächst ein Rechnerobjekt im Standardnetzwerk (default) und für die Standard DHCP Zone (cn=$domainname). Für den Rechner werden dadurch entsprechende DNS und DHCP Objekte angelegt (dns/host_record und dhcp/host). Dann wird eine dhcp_boot Richtlinie mit Vorgaben für boot_server und boot_filename angelegt. Diese Richtlinie wird letztlich dann mit dem dhcp_host für den Rechner verknüpft. Beim nächsten Netzwerkboot sollte der Rechner dann auf den entsprechenden Boot Server gehen. Wird die Richtlinie gelöscht, gelten wieder die Standardeinstellungen der Domäne.

[code]#!/bin/bash

eval “$(ucr shell)”

client=“host”
mac=“52:54:00:69:50:44”
ip=“10.200.7.83”
distr=“OS”
release=“OS 1.0”

boot_server=“10.200.7.199”
boot_filename=“abcde”

default network (default), and default

dhcp object (cn=$domainname)

network=“cn=default,cn=networks,$ldap_base”
dhcp=“cn=$domainname,cn=dhcp,$ldap_base”

this creates a host object, dns objects for the default network

and a dhcp/host object for the “cn=$domainname” dhcp object

(dhcpEntryZone), to list the dhcp/host run

udm dhcp/host list --superordinate “cn=$domainname,cn=dhcp,$ldap_base”

udm computers/linux create --position “cn=computers,$ldap_base”
-set name="$client"
-set operatingSystem="$distr"
-set operatingSystemVersion="$release"
-set mac="$mac"
-set name="$client"
-set ip="$ip"
-set network="$network"
-set dhcpEntryZone="$dhcp $ip $mac"

create a dhcp boot policy for the dhcp/host object

udm policies/dhcp_boot create --position “cn=boot,cn=dhcp,cn=policies,$ldap_base”
–set name="$client"
–set boot_server="$boot_server"
–set boot_filename="$boot_filename"

link dhcp/host object and dhcp_boot policy

udm dhcp/host modify
–dn “cn=$client,cn=$domainname,cn=dhcp,$ldap_base”
–policy-reference “cn=$client,cn=boot,cn=dhcp,cn=policies,$ldap_base”

show policy settings für dhcp_host object

udm dhcp/host list --superordinate “cn=$domainname,cn=dhcp,dc=four,dc=test”
–policies 0[/code]

Ich hoffe das hilft Ihnen weiter.
Viele Grüße

Felix Botner

Moin,

vielen Dank :slight_smile:

Können Sie mir vielleicht noch Ein Beispiel geben, wie ich die DHCP-Richtlinie sowie die weiteren Einträge eines bestimmten Rechners wieder entferne?

Noch zwei zwei kleine Korrekturen:

Statt

-set

sollte es jeweils

--set

heißen.

Damit die letzte Zeile allgemein funktioniet, habe ich aus

udm dhcp/host list --superordinate "cn=$domainname,cn=dhcp,dc=four,dc=test" \ --policies 0

die Zeile

udm dhcp/host list --superordinate "cn=$domainname,cn=dhcp,dc=four,dc=test" \ --policies 0
gemacht.

Mit freundlichen Grüßen,
Hauke Goos-Habermann

Die Richtlinie und das DHCP Objekt des Rechners können wie folgt gelöscht werden.

#!/bin/bash

eval "$(ucr shell)"

client="host"

# default network (default), and default
# dhcp object (cn=$domainname)

network="cn=default,cn=networks,$ldap_base"
dhcp="cn=$domainname,cn=dhcp,$ldap_base"

# remove dhcp_boot policy for $client
udm policies/dhcp_boot remove \
  --dn "cn=$client,cn=boot,cn=dhcp,cn=policies,$ldap_base"

# -> now $client has no longer a special boot policy (no bootserver ...)

# remove dhcp host object for $client
udm dhcp/host remove --superordinate "$dhcp" \
  --dn "cn=$client,$dhcp"

# -> now $client has no longer a dhcp_host object, $client can no longer use DHCP

# remove computer object
udm computers/linux remove --dn "cn=$client,cn=computers,$ldap_base"

# -> now $client is gone

Noch ein Hinweis. Das DHCP Objekt der Domäne “cn=$domainname,cn=dhcp,$ldap_base” ist nur vorhanden, wenn univention-dhcp auf mindestens einem Server der UCS Domäne installiert wurde.
Und die Änderung von UDM Objekten ist natürlich auf gewisse Benutzer beschränkt. Auf dem UCS Master/Backup kann als “root” (also intern mit der AdminConnection) udm verwendet werden. Auf anderen Rollen wird als “root” mit dem Maschinen-Account auf UDM zugegriffen und dieser darf in der Regel keine Änderungen vornehmen. Die Benutzer der Gruppe “Domain Admins” dürfen natürlich UDM Objekte ändern. Mit den Optionen “–binddn” und “–bindpwdfile|–bindpwd” können dem UDM Aufruf die Credentials für die Anmeldung mitgegeben werden.

Moin,

vielen Dank für die bisherige Hilfe.

Jetzt bin ich soweit, daß sich ein Client zwar anlegen und das Netzwerkbooten einmalig aktivieren und hinterher deaktivieren läßt. Ein erneutes Aktivieren des Netzwerkbootens scheitert aber mit folgender Fehlermeldung:

WARNING: No attribute with name 'bootFilename' in this module, value not set. Object created: cn=pxeboot5,cn=boot,cn=dhcp,cn=policies,dc=mydomain,dc=intranet Traceback (most recent call last): File "/usr/share/univention-directory-manager-tools/univention-cli-server", line 222, in doit output = univention.admincli.admin.doit(arglist) File "/usr/lib/pymodules/python2.7/univention/admincli/admin.py", line 393, in doit out=_doit(arglist) File "/usr/lib/pymodules/python2.7/univention/admincli/admin.py", line 1042, in _doit if 'univentionPolicyReference' not in lo.get(dn,['objectClass'])['objectClass']: KeyError: 'objectClass'

Mein Testcode zum Client-Anlegen, Netzwerkboot-Aktivieren, Netzwerkboot-Deaktivieren und erneutem Netzwerkboot-Aktivieren sieht folgendermaßen aus:

[code]eval “$(ucr shell)”

Client anlegen

udm computers/linux create --position "cn=computers,$ldap_base" \
	--set name="pxeboot5" \
	--set operatingSystem="debian" \
	--set operatingSystemVersion="wheezy" \
	--set mac="08:00:27:30:60:A5" \
	--set name="pxeboot5" \
	--set ip="192.168.1.245" \
	--set network="cn=default,cn=networks,$ldap_base" \
	--set dhcpEntryZone="cn=$domainname,cn=dhcp,$ldap_base 192.168.1.245 08:00:27:30:60:A5"

Netzwerkboot aktivieren

udm policies/dhcp_boot create --position "cn=boot,cn=dhcp,cn=policies,$ldap_base" \
	--set name="pxeboot5" \
	--set boot_server="192.168.1.240" \
	--set bootFilename="pxelinux.0"

udm dhcp/host modify \
	--dn "cn=pxeboot5,cn=$domainname,cn=dhcp,$ldap_base" \
	--policy-reference "cn=pxeboot5,cn=boot,cn=dhcp,cn=policies,$ldap_base"

Netzwerkboot DEaktivieren

# Remove dhcp_boot policy from the client. Afterwards the client has no longer a special boot policy (no bootserver ...)
udm policies/dhcp_boot remove --dn "cn=pxeboot5,cn=boot,cn=dhcp,cn=policies,$ldap_base"

# Remove the DHCP host object from the client
udm dhcp/host remove --superordinate "cn=$domainname,cn=dhcp,$ldap_base" --dn "cn=pxeboot5,cn=$domainname,cn=dhcp,$ldap_base"

Netzwerkboot erneut aktivieren

udm policies/dhcp_boot create --position "cn=boot,cn=dhcp,cn=policies,$ldap_base" \
	--set name="pxeboot5" \
	--set boot_server="192.168.1.240" \
	--set bootFilename="pxelinux.0"

udm dhcp/host modify \
	--dn "cn=pxeboot5,cn=$domainname,cn=dhcp,$ldap_base" \
	--policy-reference "cn=pxeboot5,cn=boot,cn=dhcp,cn=policies,$ldap_base"[/code]

Für eine Lösung, wie sich das Netzwerbooten mehrmals (de)aktivieren wäre ich sehr dankbar :slight_smile:

Weiß niemand eine Lösung?

Hallo,

im obigen Skript gibt es zumindest zwei Probleme:

[ul]
[li]Die policies/dhcp_boot Richtlinie kennt das Attribut boot_filename, aber nicht bootFilename (wie im Testskript).[/li]
[li]Es wird zunächst ein Rechner angelegt. Über das Attribut dhcpEntryZone wird UDM mitgeteilt, auch gleich ein dhcp/host Objekt anzulegen. Dann wird das dhcp/host geändert und irgendwann gelöscht. Der letzte Schritt ist eine Änderung des dhcp/host Objekt, das es aber gar nicht mehr gibt (Warum wird dhcp/host gelöscht. Der Netzwerkboot sollte bereits nach dem Entfernen der policies/dhcp_boot Richtlinie deaktiviert sein, oder ggf. das dhcp/host Objekt erneut anlegen, dafür müssen dann aber Daten wie MAC etc. vom Rechnerobjekt ausgelesen werden).[/li][/ul]

Viele Grüße
Felix Botner

Moin,

stimmt, in meinem Testskript hatte ich zuviel (automatisch im Editor) ersetzt. Statt “bootFilename” muß es “boot_filename” heißen.

Warum genau

udm policies/dhcp_boot remove --dn "cn=$client,cn=boot,cn=dhcp,cn=policies,$ldap_base"

und

udm dhcp/host remove --superordinate "$dhcp" --dn "cn=$client,$dhcp"

ausgeführt werden müssen, um das Netzwerbooten zu deaktivieren, weiß ich auch nicht :wink: Dafür kenne ich mich mit den Interna von UCS zu wenig aus.

Um das Netzwerkbooten wieder zu aktivieren, habe ich mit folgendem herumexperimentiert:

udm dhcp/host create --ignore_exists \ --superordinate $domainname,cn=dhcp,$ldap_base" \ --set host="$client" \ --set fixedaddress="$ip" \ --set hwaddress="ethernet $mac"

Vielleicht geht das schon in die richtige Richtung, aber funktioniert hat es damit nicht.

Im Moment umschiffe ich das Problem, indem ich den Client vor dem Netzwerkboot-Aktivieren komplett lösche und wieder neu anlege.

Eine Lösung ohne diesen Notbehelf wäre mir aber lieber.

Kann jemand helfen?

Mit freundlichen Grüßen,
Hauke Goos-Habermann

Beim Anlegen des Rechner-Objekts wird (sofern mac, ip, network und dhcpEntryZone angegeben wurden) automatisch ein DHCP-Objekt angelegt.

Damit der Client dann spezielle Boot-Paramter bekommt, haben wir ein policies/dhcp_boot-Objekt angelegt und mit dem DHCP-Objekt verknüpft. Um diese speziellen Einstellung für den Client wieder zu entfernen reicht es die Richtlinie, also das policies/dhcp_boot-Objekt, zu entfernen. Dann gibt es noch das Rechner- und DHCP-Objekt, aber eben keine vordefinierten Boot-Parameter.
[ul]
[li]Rechner-Objekt anlegen (es wird implizit ein DHCP-Objekt angelegt, wenn die entsprechenden Attribute gesetzt sind)[/li]
[li]policies/dhcp_boot-Objekt anlegen und mit DHCP-Objekt verknüpfen[/li]
[li]die Einstellungen aus dem policies/dhcp_boot-Objekt sollten jetzt für den Client greifen[/li]
[li]Richtlinie entfernen (oder Verknüpfung entfernen)[/li]
[li]das DHCP-Objekt für den Client ist weiterhin vorhanden, aber die DHCP-Boot-Einstellungen nicht mehr[/li][/ul]

Viele Grüße
Felix Botner

Moin,

vielen Dank für die Antwort.

Können Sie mir ein konkretes Beispiel (udm-Kommando + Parameter) geben, wie das Netzwerkbooten aktiviert, deaktiviert und erneut aktiviert werden kann?

Mit freundlichen Grüßen,
Hauke Goos-Habermann

[quote=“m23projekt”]Moin,

vielen Dank für die Antwort.

Können Sie mir ein konkretes Beispiel (udm-Kommando + Parameter) geben, wie das Netzwerkbooten aktiviert, deaktiviert und erneut aktiviert werden kann?

Mit freundlichen Grüßen,
Hauke Goos-Habermann[/quote]

Hallo,

also es gibt in meiner Umgebung ein Rechner-Objekt (Rechnername: host) und ein zugehöriges DHCP-Host-Objekt (dhcp: cn=host,cn=$domainname,cn=dhcp,$ldap_base, host: cn=host,cn=computers,$ldap_base). Damit dieser Rechner nun spezielle DCHP-Boot-Parameter bekommt, lege ich eine DHCP-Boot-Policy an und verknüpfe diese mit dem DHCP-Host-Objekt des Rechners.

eval "$(ucr shell)"

# create a dhcp boot policy for the dhcp/host object
udm policies/dhcp_boot create --position "cn=boot,cn=dhcp,cn=policies,$ldap_base" \
  --set name="host" \
  --set boot_server="BOOTSERVER" \
  --set boot_filename="BOOTFILE"

# link dhcp/host object and dhcp_boot policy
udm dhcp/host modify \
  --dn "cn=host,cn=$domainname,cn=dhcp,$ldap_base" \
  --policy-reference "cn=host,cn=boot,cn=dhcp,cn=policies,$ldap_base"

Jetzt sollte der Rechner diese speziellen Boot-Einstellungen beim Boot über DHCP bekommen. Die aktuellen Einstellungen können mit folgendem Kommando eingesehen werden:

eval "$(ucr shell)"
udm dhcp/host list  --superordinate "cn=$domainname,cn=dhcp,$ldap_base" --filter cn=host --policies 0

Um diese Einstellungen wieder zu entfernen, reicht es die Policy zu löschen:

eval "$(ucr shell)"
udm policies/dhcp_boot remove --dn "cn=host,cn=boot,cn=dhcp,cn=policies,$ldap_base"

Jetzt gibt es noch den Rechneraccount und der Rechner kann auch noch per DHCP verwenden, jedoch gibt es keine speziellen DHCP-Boot-Parameter mehr.

Viele Grüße
Felix Botner

Mastodon