webentwicklung-frage-antwort-db.com.de

Führen Sie `apt-get update 'aus, bevor Sie andere Pakete mit Puppet installieren

Ich versuche, ein Marionettenmodul zu erstellen, das die Installation von zend Server CE automatisiert. Dies ist hier nicht wichtig, aber die Schritte sind wie folgt

  1. aktualisieren Sie /etc/apt/source.list
  2. laden Sie den Repos-Schlüssel über Wget herunter
  3. apt-get Update durchführen
  4. führen Sie apt-get install zend-server-ce-5.2 aus

Ich habe init.pp Datei

class zendserverce {

# https://github.com/puppetlabs/puppetlabs-stdlib
file_line { 'debian_package':
    path => '/etc/apt/sources.list',
    line => 'deb http://repos.zend.com/zend-server/deb server non-free'
}

exec { "wget http://repos.zend.com/zend.key -O- |apt-key add -":
    path => ["/usr/bin", "/usr/sbin"]
}

exec { "apt-get update":
    command => "/usr/bin/apt-get update",
    onlyif  => "/bin/sh -c '[ ! -f /var/cache/apt/pkgcache.bin ] || /usr/bin/find /etc/apt/* -cnewer /var/cache/apt/pkgcache.bin | /bin/grep . > /dev/null'",
}

package { "zend-server-ce-php-5.2":
    ensure => "latest"
}

}

Scheint, dass Marionette Befehle in anderer Reihenfolge ausführt, als ich brauche. Gibt es eine Möglichkeit, wie ich ihm sagen soll, ob er meine gewünschte Reihenfolge ausführen soll?

Die Ausgabe eines solchen Snippets ist

  [0;36mnotice: /Stage[main]/Mc/Package[mc]/ensure: ensure changed 'purged' to 'latest'[0m
  [1;35merr: /Stage[main]/Zendserverce/Package[zend-server-ce-php-5.2]/ensure: change from purged to latest failed: Could not update: Execution of '/usr/bin/apt-get -q -y -o DPkg::Options::=--force-confold install zend-server-ce-php-5.2' returned 100: Reading package lists...
  Building dependency tree...
  Reading state information...
  E: Couldn't find package zend-server-ce-php-5.2 at /tmp/vagrant-puppet/modules 0/zendserverce/manifests/init.pp:28[0m
  [0;36mnotice: /Stage[main]/Zendserverce/Exec[wget http://repos.zend.com/zend.key -O- |apt-key add -]/returns: executed successfully[0m
  [0;36mnotice: /Stage[main]/Zendserverce/File_line[debian_package]/ensure: created[0m
  [0;36mnotice: Finished catalog run in 6.75 seconds[0m

So heißt es: Paket zend-server-ce-php-5.2 konnte nicht gefunden werden

Kann mir jemand helfen was falsch ist?

49
Jaro

Sie müssen die Abhängigkeitsbeziehungen angeben. Der einfachste/sauberste Ansatz ist die Verwendung des Require-Parameters, der für alle Ressourcentypen verfügbar ist.

package { "zend-server-ce-php-5.2":
  ensure  => latest,
  require  => Exec['apt-get update'],
}

usw..

49
czervik

Seit Puppet 2.6.0 war ein neues Feature "Beziehungssyntax" eingeführt .

Ein Beispiel in Puppet 2.6.0 und höher würde folgendermaßen aussehen:

exec { "apt-update":
    command => "/usr/bin/apt-get update"
}

Exec["apt-update"] -> Package <| |>

Jedes Mal, wenn ein Paketbefehl ausgeführt wird, wird die Abhängigkeit (in unserem Fall 'apt-update') zuerst ausgelöst.

100
DrDol

Ich habe die vorige Variante ausprobiert, aber es funktioniert bei Ubuntu 10.04 nicht

Zum Schluss habe ich das folgende Skript vorbereitet, das jedes Mal, wenn das Repository älter als eine Woche ist, aktualisiert wird:

exec { 'apt-get update':
    command => "/usr/bin/apt-get update",
    onlyif => "/bin/bash -c 'exit $(( $(( $(date +%s) - $(stat -c %Y /var/lib/apt/lists/$( ls /var/lib/apt/lists/ -tr1|tail -1 )) )) <= 604800 ))'"
}

Ich hoffe es hilft.

13
Pavel Železný

Ich bevorzuge es, apt-upgrade in einer separaten Stufe vor der Hauptstufe zu installieren, so dass ich keine Abhängigkeiten fest verbinden muss. Überprüfen Sie hier: http://docs.puppetlabs.com/puppet/2.7/reference/lang_run_stages.html .

Ein einfaches Beispiel würde wie folgt aussehen. Das bedeutet, dass Sie eine eigene Klasse für das eigentliche apt-update haben:

stage { "init": before  => Stage["main"] }

class {"apt-update": 
  stage => init, 
  apt_mirror => $apt_mirror 
}

Schauen Sie sich meine LAMPP-Box an, um zu sehen, wie die Teile zusammenpassen: https://github.com/joerx/vagrant-lampp

Hinweis: Seien Sie vorsichtig mit apt-upgrade, da einige Basis-Boxen von Kernel-Upgrades unterbrochen werden.

12
joerx

In Puppet 3 kann dies gemacht werden, indem virtuelle Ressourcen mithilfe von Ressourcensammlern realisiert werden

# so you don't have to fully qualify paths to binaries
Exec { path => ['/usr/bin'] }    

# virtual resource
@exec { 'Sudo apt-get update':
   tag => foo_update
}

# realize resource. filter by arbitrary "foo_update"
# tag and relate it to all Package resources
Exec <| tag == foo_update |> -> Package <| |>
4
Brandon Cook

Das Hinzufügen dieses Voodoo-Snippets funktionierte für uns:

  Apt::Pin <| |> -> Package <| |>
  Apt::Source <| |> -> Package <| |>

Dies erzwang ein Update. YMMV.

3
TimP

Für ein Paket, für das eine Aktualisierung der APT -Listen erforderlich ist, sollte Class['apt::update'] erforderlich sein.

package { "zend-server-ce-php-5.2":
   ensure => "latest",
   require => Class['apt::update']
}

Wenn Sie eine benutzerdefinierte APT - Quelle verwenden, müssen Sie nur die richtige Reihenfolge festlegen:

Apt::Source['my_source'] 
-> Class['apt::update']
0
Tombart

Sie sollten das apt-Modul wirklich verwenden, um Quellen zu erstellen und Schlüssel hinzuzufügen: https://forge.puppet.com/puppetlabs/apt

Wenn Sie hiera verwenden:

apt::sources:
  'artifactory-pro-debs':
    location: 'http://repos.zend.com/zend-server/deb'
    release: 'server
    repos: 'non-free'
    key:
      source: 'http://repos.zend.com/zend.key'
0
user1681190