vagrant puppet

vagrant - Instalación de un módulo de títeres desde un script de manifiesto



puppet (8)

Estoy usando marionetas para aprovisionar una máquina virtual vagabunda (basada en ubuntu). En mi script necesito:

sudo apt-get build-dep python-lxml

Sé que puedo instalar el módulo apt puppet para que pueda usar:

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

Pero no puedo encontrar ninguna referencia sobre cómo instalar un módulo desde el script y cómo incluirlo / exigirlo. Me parece que los documentos de marionetas se refieren solo a la instalación desde la línea de comando herramienta de marionetas

También intenté hacer algo como:

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

Pero la marioneta salió con un error en esto. Y también:

exec{"install apt module": command => "puppet module install puppetlabs/apt" } class { ''apt'': require => Exec["install apt module"]} include apt apt::builddep { ''python-imaging'': }

pero could not find declared class apt at..

¿algunas ideas? ¿direcciones? Sé que me estoy perdiendo algo obvio, pero no puedo resolver esto.

EDITAR: Si pre-instalo (con la puppet module install del puppet module install desde la línea de comandos) el apt:builddep funciona bien. Pero necesito un títere para manejar la descarga e instalación del módulo . Algunas de las otras soluciones también funcionan para el caso de uso básico, pero no responderán a mi pregunta principal.


Esto es lo que hice para que el comando de puppet module install ejecute como máximo una vez:

$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


Inspirado por la respuesta de wtanaka.com, implementé una solución como la siguiente que creo que es mucho más legible.

1) crea un nuevo archivo ruby ​​llamado ''puppet_deps.rb'' en la misma carpeta que Vagrantfile con el siguiente código:

def install_dep(name, version, install_dir = nil) install_dir ||= ''/etc/puppet/modules'' "mkdir -p #{install_dir} && (puppet module list | grep #{name}) || puppet module install -v #{version} #{name}" end

2) En su Vagrantfile, puede cargar este archivo ruby ​​y usarlo para especificar la dependencia de títeres:

# on top of your Vagrantfile require ''./puppet_deps'' ... ... # in your vm definition, use a shell provisioning this: config.vm.provision :shell, :inline => install_dep(''puppetlabs-firewall'', ''1.1.3'') config.vm.provision :shell, :inline => install_dep(''puppetlabs-stdlib'', ''4.3.2'')


La estrategia de @ brain_bacon funcionó casi perfectamente para mí, con una pequeña advertencia: si el módulo ya existe, el script de suministro falla, deteniendo el proceso de aprovisionamiento. El siguiente ajuste solucionó esto:

config.vm.provision :shell, :run => "always" do |shell| shell.inline = %{ mkdir -p /etc/puppet/modules; function install_module { folder=`echo $1 | sed s/.*-//` if [ ! -d /etc/puppet/modules/$folder ]; then puppet module install $1 fi } install_module stdlib install_module apt install_module ruby } end


Me encontré con este problema también. El truco es descargar los módulos usando un comando de shell vagabundo antes de que se ejecute el aprovisionador de marionetas.

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

El orden es importante aquí, y dado que el abastecedor de marionetas no ha ejecutado la carpeta / etc / puppet / modules aún no existe.

La razón por la que decidí, como Alonisser, instalar los módulos utilizando la herramienta de módulo de marionetas en lugar de usar una carpeta de módulos con el aprovisionador de marionetas vagabundo fue porque no quería tener que descargar todas las dependencias de los módulos que iba a utilizar. use y almacene todos esos módulos en mi control de fuente. Ejecutar estos dos comandos da como resultado 5 dependencias que de lo contrario se ubicarían en mi repositorio de git ocupando espacio.


Puede crear un directorio para módulos y agregar el módulo apt que descargó de la fragua. Entonces será modules/apt/* . Luego puede especificar este directorio de módulo en Vagrantfile ( module_path es relativo a Vagrantfile ):

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

Para obtener más información, consulte la documentation .


Puede instalar módulos de marionetas en la máquina host dentro de su vagrantdir :

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

Vagrant se encarga de montar este directorio en el lugar correcto. Por lo tanto, no es necesario ejecutar scripts que no sean el títere en el nodo.


Utilizando las respuestas de esta pregunta, creé este script:

#!/bin/bash function install_module { IFS='':'' read module version <<< "$1" if (puppet module list | grep $module ) >/dev/null; then echo "Module $module is already installed" else if [ -z "$version" ]; then puppet module install $module else puppet module install -v $version $module fi fi } if dpkg --compare-versions `puppet --version` "lt" 3.8.7; then sudo apt-get remove --purge -y puppet sudo apt-get -y autoremove fi if which puppet >/dev/null; then echo "Puppet is already installed" else echo "Installing puppet" wget https://apt.puppetlabs.com/puppetlabs-release-trusty.deb sudo dpkg -i puppetlabs-release-trusty.deb sudo apt-get update sudo apt-get install -y puppet=3.8.7* mkdir -p /etc/puppet/modules fi for var in "$@" do install_module "$var" done

Entonces puedes usarlo desde tu Vagrantfile así:

puppet_modules = [ ''puppetlabs-stdlib:4.16.0'', ''puppetlabs-apt:2.3.0'', ''puppet-nodejs:2.3.0'' ] config.vm.provision "shell", path: "puppet/scripts/puppet.sh", args: puppet_modules.join(" ")

Elimina marionetas de vm si la versión es inferior a 3.8.7 , luego instala puppet 3.8.7 y luego instala todos los módulos.

Probablemente funcionaría solo en los cuadros debian / ubuntu.


Utilizo un enfoque similar a @brain_bacon, la complicación adicional que tuve fue que, además de módulos preempaquetados como puppetlabs / nodejs, necesitaba módulos locales en relación con mi Vagrantfile. No quería registrar los módulos preempaquetados como parte de mi repositorio ni usar los submódulos de git debido a los problemas señalados por @Igor Popov.

Finalmente, la solución que elegí fue usar un script de shell para descargar los módulos, pero forzar su ruta en el directorio compartido entre el VM de Vagrant y el host, y usar .gitignore para evitar que ese camino esté bajo control de fuente.

Para ser claro, con este árbol:

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

En .gitignore , agregué

/puppet/modules/mysql

En 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