Dieser Beitrag wurde vor über 3 Monaten veröffentlicht. Die darin beschriebenen Informationen sind mit Vorsicht zu geniessen, da sie bereits veraltet oder nicht mehr gültig sein könnten. Solltest du von Neuerungen oder Verbesserungen wissen, so freue ich mich über einen klärenden Kommentar.Für eine Testumgebung musste ich heute 30 neue Maschinen installieren. Und da ich zu faul war, alles von Hand zu installieren, musste eine andere Lösung her.
Da ich Cobbler, ein System aus dem Hause Red Hat, bereits kenne, war dies mein erster Gedanke – auch wenn es an Vergewaltigung grenzt, schliesslich will ich ja openSUSE 11.4 installieren!
Also habe ich ein System von Hand aufgesetzt und darauf Cobbler samt Webinterface und TFTP installiert:
zypper ar http://download.opensuse.org/distribution/11.4/repo/oss/ oss zypper ar http://download.opensuse.org/update/11.4/ updates zypper ar http://download.opensuse.org/repositories/systemsmanagement/openSUSE_11.4/ cobbler zypper ref -s zypper install apache2-mod_python zypper install cobbler cobbler-web atftp dhcp-server
Da ich während dem Installieren nicht ungebetene Besucher in meinem System will, aktiviere ich die Authentifizierung für das Webinterface:
sed -i 's/module = authn_denyall/module = authn_configfile/' /etc/cobbler/modules.conf
Dann muss ich noch die passende IP einfügen:
IP="192.168.1.10" sed -i "s/^server: 127.0.0.1/server: $IP/" /etc/cobbler/settings sed -i "s/^next_server: 127.0.0.1/next_server: $IP/" /etc/cobbler/settings
Da meine Maschinen auch gleich via Netzwerk booten sollen, muss ich den DHCP noch an Cobbler übergeben:
sed -i 's/^manage_dhcp: 0/manage_dhcp: 1/' /etc/cobbler/settings
Nun darf die dhcpd.conf-Datei nicht mehr direkt bearbeitet werden. Dazu gibt es nun das Template unter /etc/cobbler/dhcpd.template:
# ******************************************************************
# Cobbler managed dhcpd.conf file
#
# generated from cobbler dhcp.conf template ($date)
# Do NOT make changes to /etc/dhcpd.conf. Instead, make your changes
# in /etc/cobbler/dhcp.template, as /etc/dhcpd.conf will be
# overwritten.
#
# ******************************************************************
ddns-update-style interim;
allow booting;
allow bootp;
ignore client-updates;
set vendorclass = option vendor-class-identifier;
subnet 192.168.1.0 netmask 255.255.255.0 {
option routers 192.168.1.1;
option domain-name-servers 192.168.1.9;
option subnet-mask 255.255.255.0;
range dynamic-bootp 192.168.1.150 192.168.1.254;
filename "pxelinux.0";
default-lease-time 21600;
max-lease-time 43200;
next-server $next_server;
}
#for dhcp_tag in $dhcp_tags.keys():
## group could be subnet if your dhcp tags line up with your subnets
## or really any valid dhcpd.conf construct ... if you only use the
## default dhcp tag in cobbler, the group block can be deleted for a
## flat configuration
# group for Cobbler DHCP tag: $dhcp_tag
group {
#for mac in $dhcp_tags[$dhcp_tag].keys():
#set iface = $dhcp_tags[$dhcp_tag][$mac]
host $iface.name {
hardware ethernet $mac;
#if $iface.ip_address:
fixed-address $iface.ip_address;
#end if
#if $iface.hostname:
option host-name "$iface.hostname";
#end if
#if $iface.subnet:
option subnet-mask $iface.subnet;
#end if
#if $iface.gateway:
option routers $iface.gateway;
#end if
filename "$iface.filename";
## Cobbler defaults to $next_server, but some users
## may like to use $iface.system.server for proxied setups
next-server $next_server;
## next-server $iface.next_server;
}
#end for
}
#end for
Und damit die Maschinen auch nicht ewig neustarten, wird noch eine letzte Anpassung durchgeführt:
sed -i 's/^pxe_just_once: 0/pxe_just_once: 1/' /etc/cobbler/settings
Nach dem neustarten der Services und einer letzten Einstellung ist die Installation schon abgeschlossen:
insserv apache2 insserv cobblerd insserv dhcpd rcapache2 restart rccobblerd restart rcatftpd start insserv atftpd sed -i 's/^DHCPD_INTERFACE=""/DHCPD_INTERFACE="eth0"/' /etc/sysconfig/dhcpd cobbler get-loaders cobbler sync rm -f /etc/dhcpd.conf ln -s /etc/dhcp/dhcpd.conf /etc/dhcpd.conf rcdhcpd restart rccobblerd restart cobbler sync
Einloggen kann ich mich nun unter http://192.168.1.10/cobbler_web mit dem Benutzername “cobbler” und dem Passwort “cobbler”.
Nun muss ich openSUSE zu Cobbler zufügen. Dazu lade ich zuerst das Image herunter und mounte es unter /mnt:
wget http://mirror.switch.ch/ftp/mirror/opensuse/distribution/11.4/iso/openSUSE-11.4-DVD-x86_64.iso mount -o loop -t iso9660 openSUSE-11.4-DVD-x86_64.iso /mnt
Dann kann ich das Image hinzufügen im GUI über den Punkt “Import DVD” und unter “Profile” ein neues Profil anlegen:
Doch bevor das geht, muss ich eine Kickstart-Datei erstellen. Diese wird unter /var/lib/cobbler/kickstart angelegt. Eine solche Datei kann mit autoyast2 generiert werden. Am Schluss würde alles dann etwa so aussehen:
<?xml version="1.0"?>
<!DOCTYPE profile>
<profile xmlns="http://www.suse.com/1.0/yast2ns" xmlns:config="http://www.suse.com/1.0/configns">
<firewall>
<enable_firewall config:type="boolean">false</enable_firewall>
<start_firewall config:type="boolean">false</start_firewall>
</firewall>
<general>
<ask-list config:type="list"/>
<mode>
<confirm config:type="boolean">false</confirm>
<final_reboot config:type="boolean">true</final_reboot>
</mode>
<mouse>
<id>none</id>
</mouse>
<proposals config:type="list"/>
<signature-handling>
<accept_file_without_checksum config:type="boolean">true</accept_file_without_checksum>
<accept_non_trusted_gpg_key config:type="boolean">true</accept_non_trusted_gpg_key>
<accept_unknown_gpg_key config:type="boolean">true</accept_unknown_gpg_key>
<accept_unsigned_file config:type="boolean">true</accept_unsigned_file>
<accept_verification_failed config:type="boolean">true</accept_verification_failed>
<import_gpg_key config:type="boolean">true</import_gpg_key>
</signature-handling>
</general>
<networking>
<keep_install_network config:type="boolean">true</keep_install_network>
<dns>
<dhcp_hostname config:type="boolean">true</dhcp_hostname>
<dhcp_resolv config:type="boolean">true</dhcp_resolv>
<hostname>$hostname</hostname>
</dns>
</networking>
<partitioning config:type="list">
$SNIPPET('snippets_sles/partitioning_default_lvm_sles11')
</partitioning>
<software>
$SNIPPET('snippets_sles/packages_os11')
</software>
<timezone>
<hwclock>UTC</hwclock>
<timezone>Europe/Zurich</timezone>
</timezone>
<users config:type="list">
<user>
<encrypted config:type="boolean">true</encrypted>
<fullname>root</fullname>
<gid>0</gid>
<home>/root</home>
<password_settings>
<expire></expire>
<flag></flag>
<inact></inact>
<max></max>
<min></min>
<warn></warn>
</password_settings>
<shell>/bin/bash</shell>
<uid>0</uid>
<user_password>$rootpw</user_password>
<username>root</username>
</user>
</users>
<report>
<errors>
<log config:type="boolean">true</log>
<show config:type="boolean">true</show>
<timeout config:type="integer">0</timeout>
</errors>
<messages>
<log config:type="boolean">true</log>
<show config:type="boolean">true</show>
<timeout config:type="integer">0</timeout>
</messages>
<warnings>
<log config:type="boolean">true</log>
<show config:type="boolean">true</show>
<timeout config:type="integer">0</timeout>
</warnings>
<yesno_messages>
<log config:type="boolean">true</log>
<show config:type="boolean">true</show>
<timeout config:type="integer">0</timeout>
</yesno_messages>
</report>
<runlevel>
<default>5</default>
<service>
<service_name>sshd</service_name>
<service_start>3 5</service_start>
<service_status>enable</service_status>
</service>
</runlevel>
<scripts>
<post-scripts config:type="list">
<script>
<debug config:type="boolean">false</debug>
<feedback config:type="boolean">false</feedback>
<feedback_type></feedback_type>
<filename>post_install</filename>
<interpreter>shell</interpreter>
<location><![CDATA[]]></location>
<network_needed config:type="boolean">true</network_needed>
<notification>Bitte warten ...</notification>
<source><![CDATA[/etc/init.d/sshd restart
echo 'search encodingit.ch' >> /etc/resolv.conf
chkconfig sshd on
zypper update -y
zypper dist-upgrade -y
cd /root
mkdir --mode=700 .ssh
cat >> .ssh/authorized_keys << "PUBLIC_KEY"
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC/tGYAdCxqFs8xuryisenGmk4ChEutd3Xi7WfMZsafMyGrvtBBFWUInKeF7G3GE85AxP4G4wOdn2Au3k23jSpfvbP5O/NIEMNizlzMFChu7NDC57NwMm/n+/Y6HMgHZs+LVavKrVP9MUMfif3+odOUYVxK+8BwP8So1K21UJcIgYhd48Fqw9aBYd+jXvg/QFAnXGCIARNsn51kkWYci9LuoApVg0ktJjnHIvxgs75hZsmiXH/VqU/MCv90oe0OBN1C4vABN5XIPjzOZ0HX8MQBITAdujjWqdqzictkz5vk6O0QWDVxzsxz4wgJgnF7fEGxd7t/8mInzEqMbJe4C/iJ root@cobbler
PUBLIC_KEY
chmod 600 .ssh/authorized_keys]]></source>
</script>
</post-scripts>
</scripts>
</profile>
ACHTUNG: Wer wie ich kein DNS im Netzwerk hat, der muss unter dem Punkt “Distro” bei “Kernel Options” den Hostnamen von Cobbler durch die IP ersetzen, damit alles klappt.
Damit auch alles problemlos durchläuft, müssen noch ein paar Snippets eingefügt werden unter /var/lib/cobbler/snippets/snippets_sles. So partitioning_default_lvm_sles11:
# requires: ksmeta Swap : (optional) containing the size of swap in megabytes
<drive>
<initialize config:type="boolean">true</initialize>
<partitions config:type="list">
<partition>
<create config:type="boolean">true</create>
<crypt_fs config:type="boolean">false</crypt_fs>
<filesystem config:type="symbol">ext3</filesystem>
<format config:type="boolean">true</format>
<loop_fs config:type="boolean">false</loop_fs>
<mount>/boot</mount>
<mountby config:type="symbol">device</mountby>
<partition_id config:type="integer">131</partition_id>
<partition_nr config:type="integer">1</partition_nr>
<resize config:type="boolean">false</resize>
<size>500M</size>
</partition>
<partition>
<create config:type="boolean">true</create>
<lvm_group>vg00</lvm_group>
<mountby config:type="symbol">device</mountby>
<partition_id config:type="integer">142</partition_id>
<partition_nr config:type="integer">2</partition_nr>
<resize config:type="boolean">false</resize>
<size>max</size>
</partition>
</partitions>
<pesize></pesize>
<type config:type="symbol">CT_DISK</type>
<use>all</use>
</drive>
<drive>
<device>/dev/vg00</device>
<initialize config:type="boolean">true</initialize>
<partitions config:type="list">
<partition>
<create config:type="boolean">true</create>
<crypt_fs config:type="boolean">false</crypt_fs>
<filesystem config:type="symbol">swap</filesystem>
<format config:type="boolean">true</format>
<loop_fs config:type="boolean">false</loop_fs>
<lv_name>lv_swap</lv_name>
<mount>swap</mount>
<mountby config:type="symbol">device</mountby>
<partition_id config:type="integer">130</partition_id>
<resize config:type="boolean">false</resize>
#if $getVar("Swap","") != ""
<size>${Swap}M</size>
#else
<size>2048M</size>
#end if
</partition>
<partition>
<create config:type="boolean">true</create>
<crypt_fs config:type="boolean">false</crypt_fs>
<filesystem config:type="symbol">ext3</filesystem>
<format config:type="boolean">true</format>
<loop_fs config:type="boolean">false</loop_fs>
<lv_name>lv_root</lv_name>
<mount>/</mount>
<mountby config:type="symbol">device</mountby>
<partition_id config:type="integer">131</partition_id>
<resize config:type="boolean">false</resize>
<size>max</size>
</partition>
</partitions>
<pesize>4M</pesize>
<type config:type="symbol">CT_LVM</type>
<use>all</use>
</drive>
Und auch noch packages_os11:
<patterns config:type="list">
<pattern>base</pattern>
<pattern>apparmor</pattern>
<pattern>gnome</pattern>
<pattern>file_server</pattern>
<pattern>x11</pattern>
</patterns>
<packages config:type="list">
<package>nss_ldap</package>
<package>pam_ldap</package>
## required for kdump
<package>kexec-tools</package>
<package>kdump</package>
</packages>
Nun kann ich alle Systeme erfassen und zufügen. Da dies mehrere sind, habe ich das ganze über die Konsole gemacht:
hostname=Node1 mac=00:14:4F:20:03:08 ip=192.168.1.21 cobbler system edit --name=$hostname --hostname=$hostname.encodingit.ch --netboot-enable=true --dhcp-tag=$hostname --dns-name=$hostname --ip-address=$ip --mac-address=$mac
Zum Glück starten alle Maschinen direkt ab Netzwerk, wodurch ich die Maschinen nur via iLO neustarten musste. Dazu wiederrum habe ich das folgende Script mit expect geschrieben, wo ich nur noch den Hostnamen oder die IP vom iLO übergeben muss:
#!/usr/bin/expect
#
# Version 1.0
# by Patrick Schmid
#
spawn ssh root@[lindex $argv 0]
expect "Password:" {send "password\r"}
expect "> " {send "reset /SYS -script\r"}
expect {
"Performing" {puts stdout "\nDone"}
default {puts stdout "\nError"}
}
Doch vorher noch das System synchronisieren:
cobbler sync
Nach etwa 20 Minuten sind alle Systeme installiert und konfiguriert. Voilà
Vielen Dank an Gavin und Uwe für die Hilfe!


Ich kenne mich nicht aus damit, deshalb eine kurze frage dazu, machst du damit eine Unattended installation. Sprich jede Maschiene, die mit aktiviertem Netzwerkboot startet erhält automatische ein neues bereits konfiguriertes System installiert?
Jede Maschine, die ich in Cobbler erfasst habe (mit Name, IP, MAC und zugewiesenem Profil) bootet via Netzwerk und installiert das System unattended anhand der Kickstartdatei. Die Kickstartdatei ist dabei durch Variablen für IP und Hostname dynamisch und wird für jedes erfasste System automatisch von Cobbler generiert.
Somit muss ich also ein Profil für openSUSE erstellen und die Kickstartdatei mit Partitionierung, zu installierende Pakete etc dem Profil zufügen. Nun erfasse ich meine x Systeme mit IP, Name und MAC und starte diese, wodurch meine x Systeme automatisch und bis auf die statische IP und den Hostnamen identisch installiert werden.
Klar(er)?
Jep. Ist klarer.
Ich konnte nichts mit Cobbler anfangen und musste anhand deiner Ausführungen erraten, was dein Ziel ist.
Offenbar ist mir das gut gelungen.
Pingback: Opensuse ch | Gupemanb