Paket von PPA mit Puppet installieren

8

Ich versuche, VMs automatisch mit vorinstalliertem Docker bereitzustellen.

Meine Standard-init.pp sieht folgendermaßen aus:

class { 'apt':
 always_apt_update    => true,
}

package { [
    #'build-essential',
    #'vim',
    #'curl',
    #'zsh',
    #'git-core',
    #'htop',
    #'wget',
    #'linux-image-generic-lts-raring',
    'python-software-properties'
    #'lxc-docker'
  ]:
  ensure  => 'installed',
}

apt::ppa { 'ppa:dotcloud/lxc-docker':}

# refresh apt source
exec { "apt-update":
  command => "/usr/bin/apt-get update && apt-get install lxc-docker --force-yes",
  returns => 100
}

Der letzte Befehl exec gibt zurück (return 100 ist die Standardeinstellung für ein erfolgreiches apt-get-Update, glaube ich):

info: / Stage [main] // Apt :: Ppa [ppa: dotcloud / lxc-docker] / Exec [add-apt-repository-ppa: dotcloud / lxc-docker]: Planen der Aktualisierung von Exec [apt_update] Hinweis: / Stage [main] / Apt :: Update / Exec [apt_update] / gibt zurück: erfolgreich ausgeführt Hinweis: / Stage [main] / Apt :: Update / Exec [apt_update]: Aus 1 Ereignissen 'Aktualisierung' ausgelöst

Wenn ich jedoch ssh in die Box Docker nicht installiert ist und läuft, apt-get install lxc-dockerkann ich es dann installieren. Was mache ich falsch? Ich kann es nicht mit einer Vielzahl unterschiedlicher Konfigurationen zum Laufen bringen.

Digital
quelle

Antworten:

13

apt-getGibt 0 bei Erfolg und 100 bei Fehler zurück, wie Sie auf der apt-getManpage leicht sehen können . Also hast du das rückwärts. Sie kombinieren zwei Befehle mit &&, was bedeutet, dass der zweite Befehl nur ausgeführt wird, wenn der erste erfolgreich abgeschlossen wurde (Rückgabe von 0). Wenn also apt-get update"100" zurückgegeben würde, wie Sie fälschlicherweise erwarten, würde der zweite Befehl nicht einmal ausgeführt.

Wenn Sie die Protokollnachricht sorgfältig lesen, werden Sie feststellen, dass die angewendete Exec-Ressource "apt_update" und nicht "apt-update" heißt. Ersteres wird in der aptKlasse definiert und ausgeführt, wenn die apt::ppaRessource angewendet wird. Letzteres ist Ihre eigene Exec-Ressource, die ebenfalls in der Protokollausgabe angezeigt wird, jedoch als Exec[apt-update]. Suchen Sie danach.

In jedem Fall funktioniert das, was Sie hier erstellt haben, nicht, weil Sie versuchen, Puppet als verherrlichtes Shell-Skript zu verwenden und es falsch machen. Puppet ignoriert die Reihenfolge, in der Sie Ressourcen im Manifest angeben, und wendet sie stattdessen nach eigenem Ermessen an. Um sicherzustellen, dass das lxc-dockerPaket von der angegebenen PPA installiert wird, müssen Sie sicherstellen, dass die PPA-Ressource vor der Paketressource angewendet wird.

Dazu gibt es einige Möglichkeiten, bei denen Sie Beziehungen oder Abhängigkeiten angeben. Hier ist eine Möglichkeit, Verkettungspfeile zu verwenden :

class { 'apt':
 always_apt_update => true,
}

apt::ppa { 'ppa:dotcloud/lxc-docker':}

# Your regular packages don't know or care about the PPA
package { [
    'build-essential',
    'vim',
    'curl',
    'zsh',
    'git-core',
    'htop',
    'wget',
    'linux-image-generic-lts-raring',
    'python-software-properties'
  ]:
  ensure  => 'installed',
}

# We single lxc-docker out to be able to specify 
# the relationship to Apt::Ppa properly
package { 'lxc-docker':
  ensure => 'installed'
}

Apt::Ppa['ppa:dotcloud/lxc-docker'] ->
Package['lxc-docker']

Dies bedeutet, dass die Paketressource lxc-dockerangewendet wird, nachdem die apt::ppaRessource für die PPA "ppa: dotcloud / lxc-docker" angewendet wurde. Wie bereits erläutert, apt::ppakümmert sich die Ressource bereits nach dem Hinzufügen eines PPA um die Aktualisierung des APT-Cache, sodass apt-get updatenirgendwo explizit aufgerufen werden muss.

daff
quelle
Sie müssen weiterhin Exec['apt_update']für Ihre Pakete eine PPA installieren. Das Erfordernis der PPA vor dem Paket erzwingt nicht die Beziehung zwischen dem Exec und dem Paket.
Daxlerod
1

Und hier ist eine alternative, idiomatische Antwort mit require:

class { 'apt':
 always_apt_update => true,
}

apt::ppa { 'ppa:dotcloud/lxc-docker':}

package { [others]: }    

package { 'lxc-docker':
  ensure  => 'installed',
  require => Apt::Ppa['ppa:dotcloud/lxc-docker']
}
msanford
quelle