web-dev-qa-db-fra.com

Exécutez `apt-get update` avant d'installer d'autres paquets avec Puppet

J'essaie de créer un module de marionnettes qui automatise l'installation de zend server CE, ce n'est pas important ici, mais les étapes sont les suivantes:

  1. mettre à jour /etc/apt/source.list
  2. télécharger la clé de mise en pension via wget
  3. faire apt-get update
  4. faire apt-get installer zend-server-ce-5.2

J'ai le fichier init.pp

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"
}

}

Semble que la marionnette exécute des commandes dans un ordre différent de celui dont j'ai besoin. Est-il possible de lui dire de courir dans l'ordre que je souhaite?

La sortie d'un tel extrait est

  [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

Donc, il dit: Impossible de trouver le paquet zend-server-ce-php-5.2

Quelqu'un peut-il me guider ce qui ne va pas?

49
Jaro

Vous devez spécifier les relations de dépendance. L'approche la plus simple et la plus propre consiste à utiliser le paramètre require disponible pour tous les types de ressources.

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

etc..

49
czervik

Depuis Puppet 2.6.0, une nouvelle fonctionnalité "syntaxe de relation" était introduite introduite .

Un exemple dans Puppet 2.6.0 et supérieur pourrait ressembler à ceci:

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

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

Chaque fois qu'une commande de paquet est exécutée, la dépendance (dans notre cas 'apt-update') sera déclenchée poing . Vous pouvez même définir des chaînes plus longues.

100
DrDol

J'ai essayé la variante précédente mais cela ne fonctionne pas pour moi sur Ubuntu 10.04

Enfin, j'ai préparé le script suivant, qui exécute update à chaque fois que le référentiel a plus d'une semaine:

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 ))'"
}

J'espère que ça aide.

13
Pavel Železný

Je préfère placer apt-upgrade dans une étape distincte en cours d'exécution avant l'étape principale, de sorte que je n'ai pas à câbler aucune dépendance. Vérifiez ici: http://docs.puppetlabs.com/puppet/2.7/reference/lang_run_stages.html .

Un exemple simple ressemblerait à celui ci-dessous. Cela implique que vous ayez une classe séparée pour faire la mise à jour actuelle d'apt-update:

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

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

Regardez mon exemple de boîte LAMPP sur github pour voir comment les pièces s’assemblent: https://github.com/joerx/vagrant-lampp

Note: soyez prudent avec apt-upgrade, car certaines boîtes de base cassent des choses comme les mises à jour du noyau.

12
joerx

Dans Puppet 3, cela peut être fait en réalisant des ressources virtuelles en utilisant des collecteurs de ressources

# 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

L'ajout de cet extrait de vaudou a fonctionné pour nous:

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

Cela a forcé une mise à jour. YMMV.

3
TimP

Le paquet nécessitant une mise à jour des listes APT devrait nécessiter Class['apt::update']

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

Si vous utilisez une source personnalisée APT, assurez-vous que l'ordre est correct:

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

Vous devriez vraiment utiliser le module apt pour créer des sources et ajouter des clés: https://forge.puppet.com/puppetlabs/apt

Si vous utilisez hiera:

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