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:

Voraussetzungen

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 ?.