从清单脚本安装puppet模块

我使用木偶来提供一个stream浪者(基于Ubuntu的)虚拟机。 在我的脚本中,我需要:

sudo apt-get build-dep python-lxml 

我知道我可以安装apt puppet模块,所以我可以使用:

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

但是我找不到有关从脚本安装模块的任何参考,以及如何包含/需要它。 在我看来,木偶文档只是指从命令行木偶工具安装

我也尝试做类似的事情:

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

但傀儡退出这个错误。 并且:

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

但得到could not find declared class apt at..

有任何想法吗? 方向? 我知道我错过了一些明显的东西,但不能弄清楚。

编辑:如果我预安装(与puppet module install apt:builddep puppet module installapt:builddep工作正常。 但是我需要木偶来处理模块的下载和安装 。 其他一些解决方法也适用于基本用例,但不会回答我的主要问题。

我也遇到了这个问题。 诀窍是在puppetconfiguration程序运行之前使用vagrant shell命令下载模块。

 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 

顺序在这里很重要,而且由于puppet provisioner没有运行文件夹/ etc / puppet / modules还不存在。

我决定像alonisser一样使用puppet模块工具来安装模块,而不是使用stream浪者puppet provisioner的模块文件夹,这是因为我不想下载所有我想要的模块的依赖关系使用和存储所有这些模块在我的源代码pipe理。 运行这两个命令会产生5个依赖关系,否则这些依赖关系会占用我的git存储库占用的空间。

以下是我所做的最多一次运行puppet module install命令:

 $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 

我使用了一种类似于@brain_bacon的方法 – 我所使用的额外复杂function是除了预先打包的模块(如puppetlabs / nodejs)之外,我还需要与我的Vagrantfile相关的本地模块。 我不想检查预打包的模块作为我的仓库的一部分,也不使用git子模块,因为@Igor Popov指出的问题。

最后,我select的解决scheme是使用一个shell脚本来下载模块,但强制其path进入Vagrant VM和主机之间的共享目录,并使用.gitignore来避免该path受到源代码控制。

要清楚,用这棵树:

 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 

.gitignore我补充说

  /puppet/modules/mysql 

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 

您可以在您的vagrantdir主机上安装木偶模块:

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

Vagrant负责将这个目录安装到正确的地方。 因此,不需要在节点上运行puppet本身以外的脚本。

受到wtanaka.com的回答的启发,我实现了一个像下面这样的解决scheme,我认为它更可读。

1)在Vagrantfile文件夹下创build一个名为“puppet_deps.rb”的新红宝书文件,代码如下:

 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)在你的Vagrantfile中,你可以加载这个ruby文件并使用它来指定puppet依赖:

 # 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') 

您可以为模块创build一个目录,并添加从伪造下载的apt模块。 所以它将是modules/apt/* 。 然后你可以在Vagrantfile指定这个模块目录( module_path是相对于Vagrantfile ):

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

欲了解更多信息,请参阅文档 。

@ brain_bacon的策略对我来说几乎是完美的,只有一个小小的警告 – 如果模块已经存在,那么configuration脚本失败,停止configuration过程。 以下调整固定了这个:

 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 

使用这个问题的答案,我创build了这个脚本:

 #!/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 

那么你可以像这样从你的Vagrantfile使用它:

 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(" ") 

如果版本低于3.8.7 ,则从vm中移除puppet,然后安装puppet 3.8.7 ,然后安装所有模块。

这可能只适用于Debian / Ubuntu的盒子。