35 votes

Installation d'un module de marionnettes à partir d'un script manifeste

Je suis à l'aide de marionnettes à disposition un vagabond (basée sur ubuntu) de la machine virtuelle. Dans mon script j'ai besoin de:

sudo apt-get build-dep python-lxml

Je sais que je peux installer l' apt de la marionnette module donc je peux l'utiliser:

apt::builddep { 'python-lxml': }

Mais je ne trouve pas de référence à propos de l'installation d'un module à partir du script et comment inclure/l'exigent. Me semble que la marionnette docs se réfèrent uniquement à l'installation depuis la ligne de commande de l'outil marionnette

J'ai aussi essayé de faire quelque chose comme:

define build_dep($pkgname){
    exec {
    "builddepend_$pkgname":
    commmand => "sudo apt-get build-dep $pkgname";
    }
}
build_dep{
    "python-imaging":
    pkgname => "python-imaging";

    "python-lxml":
    pkgname => "python-lxml";
}

Mais la marionnette est sorti avec une erreur sur ce point. Et aussi:

exec{"install apt module":

    command => "puppet module install puppetlabs/apt"
}

class { 'apt':
        require => Exec["install apt module"]}
include apt

apt::builddep { 'python-imaging':
 }

mais j'ai reçu could not find declared class apt at..

des idées? les directions? Je sais que je suis absent quelque chose d'évident, mais ne peut pas comprendre cela.

EDIT: Si je l'ai pré-installer (avec puppet module install à partir de la ligne de commande) l' apt:builddep fonctionne très bien. Mais j'ai besoin de marionnettes à manipuler le module de téléchargement et d'installation. Certains des autres solutions travaillent aussi à la base de cas d'utilisation, mais ne pas répondre à ma question principale.

63voto

brain_bacon Points 441

J'ai rencontré ce type de problème. Le truc, c'est de télécharger les modules à l'aide d'un vagabond commande shell avant de la marionnette provisioner s'exécute.

config.vm.provision :shell do |shell|
  shell.inline = "mkdir -p /etc/puppet/modules;
                  puppet module install puppetlabs/nodejs;
                  puppet module install puppetlabs/apache"
end

config.vm.provision :puppet do |puppet|
  puppet.manifests_path = "puppet/manifests"
  puppet.manifest_file = "site.pp"
end

L'ordre est important ici, et depuis la marionnette provisioner n'a pas exécuté le dossier /etc/puppet/modules n'existe pas encore.

La raison que j'ai décidé, comme alonisser, pour installer les modules à l'aide de la marionnette module de l'outil au lieu d'utiliser un module de dossier avec le vagabond de marionnettes provisioner était parce que je ne veux pas avoir à les télécharger toutes les dépendances des modules que j'allais utiliser et stocker l'ensemble de ces modules dans mon contrôle de code source. L'exécution de ces deux commandes résultats en 5 dépendances qui serait autrement s'asseoir dans mon dépôt git prenant de la place.

14voto

wtanaka.com Points 97

Voici ce que j'ai fait pour que la commande puppet module install s'exécute au plus une fois:

 $script = <<EOF
mkdir -p /etc/puppet/modules
(puppet module list | grep puppetlabs-mysql) ||
   puppet module install -v 2.1.0 puppetlabs/mysql
EOF

Vagrant::Config.run do |config|
   config.vm.provision :shell, :inline => $script
 

7voto

J'utilise une approche similaire à @brain_bacon - la complication supplémentaire, j'ai eu est que, en plus de modules préconfigurés comme puppetlabs/nodejs j'avais besoin de modules locaux par rapport à mon Vagrantfile. Je n'ai pas envie de valider les modules préconfigurés dans le cadre de mon référentiel, ni utiliser des submodules à cause des problèmes que l'a souligné @Igor Popov.

Enfin la solution que j'ai choisi est d'utiliser un script shell pour télécharger les modules, mais le fait de forcer leur chemin vers le répertoire partagé entre l'Errance et des machines virtuelles de l'hôte, et de l'aide .gitignore pour éviter que le chemin d'accès qui est sous contrôle de code source.

Pour être clair, avec cet arbre:

jcmendez$ tree
.
├── README.md
├── Vagrantfile
├── files
├── puppet
│   ├── manifests
│   │   └── init.pp
│   └── modules
│       ├── misc
│       │   └── manifests
│       │       └── init.pp
│       ├── mysql
   ...
│       └── wordpress
│           ├── files
│           │   ├── wordpress-db.sql
│           │   ├── wp-config.php
│           │   └── wp-tests-config.php
│           └── manifests
│               └── init.pp
└── wordpress

Sur .gitignore j'ai ajouté

  /puppet/modules/mysql

Sur Vagrantfile

  config.vm.provision :shell do |shell|
    shell.inline = "puppet module install puppetlabs/mysql --force --modulepath '/vagrant/puppet/modules'"
  end

  config.vm.provision :puppet do |puppet|
    puppet.manifests_path = 'puppet/manifests'
    puppet.module_path = 'puppet/modules'
    puppet.manifest_file  = "init.pp"
    puppet.options="--verbose --debug"
  end

4voto

sebastianwagner Points 302

Vous pouvez installer des modules de marionnettes sur la machine hôte dans votre vagrantdir :

 puppet module --modulepath=./puppet/modules/ install puppetlabs/mysql
 

Vagrant prend soin de monter ce répertoire au bon endroit. Il n’est donc pas nécessaire d’exécuter des scripts autres que la marionnette elle-même sur le nœud.

1voto

Gergo Erdosi Points 9712

Vous pouvez créer un répertoire pour les modules et ajouter le module apt que vous avez téléchargé de la forge. Donc ce sera modules/apt/* . Ensuite, vous pouvez spécifier ce répertoire de modules en Vagrantfile ( module_path est relatif à Vagrantfile ):

 Vagrant.configure("2") do |config|
  config.vm.provision :puppet do |puppet|
    puppet.module_path = "modules"
  end
end
 

Pour plus d'informations, voir la documentation .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X