Virtualisierter Server – APT-Updates zentral verwalten mit apt-dater
In diesem Beitrag beschreibe ich, wie sich Updates für Debian-basierte
Systeme mit apt-dater
von einem zentralen Host aus
verwalten und installieren lassen. apt-dater
stellt im Frontend eine ncurses
-Oberfläche zur
Verfügung und verbindet sich im Hintergrund über SSH mit den angegebenen
Hosts, um dort mit apt-get
und
aptitude
(für komplexere Abhängigkeiten) das
Paketsystem zu bedienen.
Weitere Beiträge in der Reihe:
- Umzug von Proxmox und VMs auf SSD
- RAID-Controller Marvell 88SE9230 unter Debian live verwalten
- automatische DNS-Einträge für IPv6-Adressen mit wechselndem Präfix
- Puppet-Module: Apache-VHosts mit SSL und Kerberos aus FreeIPA sichern
- Kerberos-basiertes Single-Sign-On (SSO) für SSH und Firefox
- Authentifizierung gegen FreeIPA für Proxmox, pfsense, Puppet und Postfix
- Domäne mit FreeIPA
- Puppet strukturieren mit Profilen, Environments, r10k und git
- Mail-Relay für die VMs mit Postfix und Sendgrid
- SSL überall mit Let’s Encrypt, verteilt durch Puppet
- Puppet Server aufsetzen
- pfsense-Firewall zur Einteilung des Netzwerks mit ipv4 und ipv6
- IPv6-Vorüberlegungen
- Hardware-Setup und Proxmox
Voraussetzungen
- Ein Host muss für Management-Zwecke bereitgestellt werden. Auf dem Host darf auch noch mehr laufen, über Sicherheit sollte man sich aber Gedanken machen, da dieser Host mit seinem privaten SSH-Schlüssel Zugriff auf die anderen Hosts hat.
- Ein privater SSH-Schlüssel muss erstellt und auf dem Management-Host gespeichert werden; der dazugehörige öffentliche Schlüssel muss auf jeden zu verwaltenden Host gespielt werden.
- Mein
apt-dater
-Modul aus der Puppet Forge kann den Rest übernehmen. - Eine funktionierende Instanz der PuppetDB wird gebraucht, da die Clients ihre Teilnahme am Update-Verbund mittels exported resources an den Host mitteilen, der darüber eine Liste führt. Wie man sich ein Setup mit PuppetDB aufsetzt habe ich in einem vorhergehenden Artikel beschrieben.
- Sinnvoll ist auch die Verwendung eines zentralen Caches für
apt
, damit nicht jeder Host die selben Pakete einzeln herunterlädt. Zur Verwendung von Apt-Cacher-NG habe ich einen Artikel im Blog veröffentlicht.
Setup
Mein Setup basiert stark auf der Verwendung von
Profilen,
mit deren Hilfe allgemein gehaltene Puppet-Module in mein Netzwerk
integriert werden, vergleichbar mit Adaptern. Die Verwendung von
apt-dater
wird hier also auch mit einem Profil
vorgestellt, die Installation sollte aber auch ohne machbar sein.
Die Installation beschränkt sich auf ein paar wenige Zeilen:
class profiles::aptdater {
$username = lookup('profiles::aptdater::username', String, 'first', 'apt-dater')
$homedir = "/home/${username}"
$ssh_pubkey = lookup('profiles::aptdater::ssh_pubkey', String, 'first')
$ssh_privkey = lookup('profiles::aptdater::ssh_privkey'), String, 'first')
$ishost = lookup('profiles::aptdater::ishost', Boolean, 'first', false)
$isclient = !$ishost,
if $ishost and !$ssh_privkey {
fail("Node ${::facts['fqdn']} is defined as host but has no private key!")
}
class { 'aptdater':
ishost => $ishost,
isclient => $isclient,
username => $username,
homedir => $homedir,
}
if $ishost {
file { '/etc/apt-dater/ssh/id_rsa':
ensure => 'present',
owner => $username,
group => $username,
mode => '0600',
content => $ssh_privkey,
}
} else {
file { '/etc/apt-dater/ssh/id_rsa':
ensure => 'absent'
}
}
ssh_authorized_key { 'apt-dater':
ensure => 'present',
type => 'ssh-rsa',
user => $username,
key => $ssh_privkey
}
}
Dazu sind noch einige Einstellungen in Hiera notwendig. Wo hier was eingetragen wird ist natürlich stark von der eigenen Infrastruktur abhängig, dahier folgt jetzt nur ein sehr allgemeines Beispiel zur Verdeutlichung:
Datei data/common.yaml
, wird in der
hiera.yaml
für alle Nodes geladen:
classes:
- 'apt-dater'
profiles::aptdater::ssh_pubkey: AAA... #hier den Pubkey ohne ssh-rsa reinkopieren
Dabei wird davon ausgegangen, dass an irgendeiner Stelle das Array
classes
aus Hiera für Puppet
include
-d wird, was allgemein üblich sein sollte.
Datei data/nodes/host.domain.tld.yaml
:
profiles::aptdater::ishost: true
profiles::aptdater::ssh_privkey: >
# Hier den SSH private key rein kopieren.
Den private key sollte man nicht unbedingt unverschlüsselt im Git-Repository liegen haben, auch wenn man das irgendwo privat hostet. Der Schlüssel muss natürlich Puppet unverschlüsselt bekannt sein, damit er auf dem Zielsystem eingebaut werden kann, zumindest in Ruhe kann man vertrauliche Daten aber verschlüsselt hinterlegen. Wie man Puppet mit eYaml verwenden kann, habe ich in einem vorhergehenden Beitrag beschrieben.
Verwendung
Nachdem Puppet die geplanten Änderungen im Netzwerk verteilt hat, reicht
es bereits, auf dem zentralen Host mit
sudo apt-dater
das Frontend zu öffnen und man
erhält einen Überblick über alle Hosts und deren Update-Status. Eine
Liste von Tastaturkürzeln erhält man durch Eingabe von
?
.