Installation du package à partir de PPA à l'aide de Puppet

8

J'essaie de provisionner automatiquement les machines virtuelles avec docker préinstallé.

Mon init.pp par défaut ressemble à:

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
}

La dernière commande exec retourne (retour 100 est par défaut pour une mise à jour apt-get réussie je pense):

info: / Stage [main] // Apt :: Ppa [ppa: dotcloud / lxc-docker] / Exec [add-apt-repository-ppa: dotcloud / lxc-docker]: Planification de l'actualisation d'Exec [apt_update] notice: / Stage [main] / Apt :: Update / Exec [apt_update] / renvoie: exécuté avec succès remarque: / Stage [main] / Apt :: Update / Exec [apt_update]: 'Actualisation' déclenchée à partir de 1 événements

Cependant quand je ssh dans le docker de boîte n'est pas installé et fonctionnant apt-get install lxc-dockerje peux alors l'installer. Qu'est-ce que je fais mal? Je n'arrive pas à le faire fonctionner avec une multitude de configurations différentes.

numérique
la source

Réponses:

13

apt-getrenvoie 0 en cas de succès et 100 en cas d'erreur, comme vous pouvez facilement le voir dans la apt-getpage de manuel. Vous avez donc cela à l'envers. Vous combinez deux commandes à l'aide de &&, ce qui signifie que la deuxième commande n'est exécutée que lorsque la première se termine avec succès (retourne 0). Donc, si apt-get updatevous renvoyiez "100", comme vous vous y attendez à tort, la deuxième commande ne serait même pas exécutée.

Et si vous lisez attentivement le message du journal, vous verrez que la ressource Exec appliquée est nommée "apt_update" et non "apt-update". Le premier est défini dans la aptclasse et exécuté lorsque la apt::pparessource est appliquée. Ce dernier est votre propre ressource Exec, qui apparaîtrait également dans la sortie du journal, mais en tant que Exec[apt-update]. Cherchez ça.

Dans tous les cas, ce que vous avez construit ici ne fonctionne pas parce que vous essayez d'utiliser Puppet comme un script Shell glorifié et que vous le faites mal. Puppet ignore l'ordre dans lequel vous spécifiez les ressources dans le manifeste et les applique à la place comme il l'entend. Donc, pour vous assurer que le lxc-dockerpackage est installé à partir du PPA spécifié, vous devez vous assurer que la ressource PPA est appliquée avant la ressource du package.

Il existe plusieurs façons de le faire, toutes impliquant que vous spécifiez des relations ou des dépendances. Voici une façon, en utilisant les flèches de chaînage :

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']

Cela signifie que la lxc-dockerressource de package sera appliquée après l'application de la apt::pparessource pour le PPA "ppa: dotcloud / lxc-docker". Comme expliqué, la apt::pparessource s'occupe déjà de la mise à jour du cache APT après l'ajout d'un PPA, il n'est donc pas nécessaire d'appeler explicitement apt-get updaten'importe où.

daff
la source
Vous devez toujours exiger Exec['apt_update']sur vos packages installés à partir d'un PPA. Exiger le PPA avant le package n'impose pas la relation entre l'Exec et le package.
daxlerod du
1

Et voici une réponse alternative idiomatique utilisant 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
la source