11
Puppet 2.7.19
Vagrant version 1.0.6
VM OS Ubuntu 12.04

我正在尝试从 vagrant 设置 puppet 模块路径。这看起来应该很简单。

在我的流浪文件中,我有:

Vagrant::Config.run do |config|
  config.vm.provision :puppet, :module_path => "my_modules"
  config.vm.provision :puppet, :options => ["--modulepath", "my_modules"]
end

当我更改模块路径的值时,它似乎没有效果(之后vagrant reload

这是一个片段vagrant up

[default] -- v-root: /vagrant
[default] -- manifests: /tmp/vagrant-puppet/manifests
[default] -- v-pp-m0: /tmp/vagrant-puppet/modules-0

注意/tmp/vagrant-puppet/modules-0? 这是关于什么的?

然后从 vagrant 内部:

vagrant@precise64:~$ puppet apply --configprint modulepath
/home/vagrant/.puppet/modules:/usr/share/puppet/modules

所以当我这样做时:puppet module install puppetlabs/mysql

我收到此错误:

Preparing to install into /home/vagrant/.puppet/modules ...
Error: Could not install module 'puppetlabs-mysql' (latest)
  Directory /home/vagrant/.puppet/modules does not exist

所以我必须要:

vagrant@precise64:~/.puppet$ mkdir /home/vagrant/.puppet/modules
vagrant@precise64:~/.puppet$ puppet module install puppetlabs/mysql
Preparing to install into /home/vagrant/.puppet/modules ...
Downloading from http://forge.puppetlabs.com ...
Installing -- do not interrupt ...
/home/vagrant/.puppet/modules
└─┬ puppetlabs-mysql (v0.6.1)
  └── puppetlabs-stdlib (v3.2.0)

然后我必须将模块移动到 vagrant 可以看到它们的位置......

mv /home/vagrant/.puppet/modules/mysql /tmp/vagrant-puppet/modules-0

似乎这可能是一个错误,或者我真的错过了一些东西。看起来很基本,所以我想听听其他人是如何解决这个问题的。

谢谢!

4

3 回答 3

12

您有效地指定了 module_path 两次:

Vagrant::Config.run do |config|
  config.vm.provision :puppet, :module_path => "my_modules"
  config.vm.provision :puppet, :options => ["--modulepath", "my_modules"]
end

我不确定哪个最终会覆盖另一个,但是您不应该以两种方式指定模块路径。

我认为最好使用 vagrant 对 module_path 的支持而不是:options数组,就像你的第一行一样。我更喜欢以下风格:

Vagrant::Config.run do |config|
  ...
  config.vm.provision :puppet do |puppet|
    puppet.manifests_path = "manifests"
    puppet.module_path = ["modules-contrib","modules-custom"]
    puppet.manifest_file  = "site.pp"
  end # puppet
end # config

你问了关于/tmp/vagrant-puppet/modules-0. 这是 modulepath 数组中的第一项,其中0是数组索引。即在我上面的示例中,我的 vagrant 项目中的modules-contribmodules-custom目录分别安装在/tmp/vagrant-puppet/modules-0/tmp/vagrant-puppet/modules-1

您不应该在 vagrant box 中安装 puppet 模块。相反,将它们安装在主机环境中 vagrant 项目的模块目录中。

我建议不要一个一个地安装它们,而是使用图书馆员gem install librarian-puppet木偶Puppetfile(您用于自定义 puppet 模块的那个。我使用modules-contrib第三方模块的目录,并将我自己的放在modules-custom.

告诉图书馆员把它的模块放在哪里:

librarian-puppet config --local path modules-contrib

有关 Puppetfile 的布局,请参阅https://github.com/rodjek/librarian-puppet。它非常简单,可以让你随意混合 puppet-forge 和 git 源。

您应该将modules-contrib文件夹添加到.gitignore文件中(假设您使用 git),并依赖Puppetfile文件的版本控制。

于 2013-06-04T15:08:57.653 回答
6

正如它从Vagrant Documentation中读取的那样:

Vagrant Puppet 配置器允许您将模块的本地文件夹挂载到 VM 上,并将配置 Puppet 以自动识别它们。

本地文件夹是指主机上的文件夹。

接着:

模块路径相对于包含 Vagrantfile 的文件夹展开。

包含 VagrantFile 的文件夹在您的主机上。

因此,您尝试使用设置主机上文件夹路径的选项来控制 VM 上文件夹的路径。

您必须将模块放在主机上,而不是虚拟机上。这是一个例子:

主机

~/Dev/mybox/ -> “mybox” Vagrant VM 的基本路径

~/Dev/mybox/VagrantFile -> 控制“mybox”的 Vagrant 文件

~/Dev/mybox/puppet/modules -> "mybox" 上使用的 puppet 模块的路径

~/Dev/mybox/puppet/modules/apache -> 要在“mybox”上应用的 apache 模块的路径

流浪文件:

  # Enable puppet provisioning
  config.vm.provision :puppet do |puppet|
     puppet.module_path = "puppet/modules"
     puppet.manifests_path = "puppet"
     puppet.manifest_file  = "mybox.pp"
  end

虚拟机

当我启动 mybox 时:

[default] Mounting shared folders...
[default] -- v-root: /vagrant
[default] -- manifests: /tmp/vagrant-puppet/manifests
[default] -- v-pp-m0: /tmp/vagrant-puppet/modules-0

然后

vagrant@mybox:~$ cd /tmp/vagrant-puppet/modules-0
vagrant@mybox:/tmp/vagrant-puppet/modules-0$ ls
apache

如您所见,主机上的 ~/Dev/mybox/puppet/modules/apache 目录安装在 Vagrant VM 上的 /tmp/vagrant-puppet/modules-0 上。

希望这可以帮助。

于 2013-05-03T01:41:20.703 回答
0

所以,如果你像我一样一直盯着这个问题和答案,想知道你的情况有什么不同,这就是我所缺少的:

从关于配置的 vagrant 文档中,我选择了这个片段:

config.vm.provision :puppet do |puppet|
  puppet.manifests_path = "my_manifests"
  puppet.manifest_file = "default.pp"
end

在尝试让来宾识别模块时,我拿起了这一行(可能来自这里):

config.vm.provision :puppet, :module_path => "my_modules"

不太了解 ruby​​ 或 vagrant,我把它放在第一个片段下面,假设它会以某种方式添加到它。那没有用。

然而,起作用的

config.vm.provision :puppet do |puppet|
  puppet.manifests_path = "my_manifests"
  puppet.manifest_file  = "default.pp"
  puppet.module_path = "my_modules"
end

有时最简单的解决方案是最难找到的。

[编辑]

它还有助于理解在来宾 VM 上执行“puppet apply --configprint modulepath”命令不会向您显示 puppet 在 Vagrant 调用时将使用的模块路径。

于 2013-05-30T13:08:43.547 回答