Бродячий кукольный модульный путь

Puppet 2.7.19
Vagrant version 1.0.6
VM OS Ubuntu 12.04

Я пытаюсь установить путь марионеточного модуля от бродяги. Кажется, что это должно быть очень просто.

В моем файле бродяг я:

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

Когда я изменяю значение пути к модулю, это, кажется, не имеет эффекта (после vagrant reload)

Вот snipplet из 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? Что это значит?

Затем изнутри бродяг:

[email protected]:~$ 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

Поэтому я должен:

[email protected]:~/.puppet$ mkdir /home/vagrant/.puppet/modules
[email protected]:~/.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)

И тогда мне нужно переместить модули на место, где бродяга может их увидеть...

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

Похоже, возможно, это ошибка, или я действительно что-то пропустил. Кажется довольно основным, поэтому я хотел бы услышать, как другие решили это.

Спасибо!

Ответ 1

Вы дважды указываете module_path:

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

Я не уверен, что приведет к переопределению другого, но вы не должны указывать путь к модулю в обоих направлениях.

Я думаю, что лучше использовать бродячую поддержку для 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 - это индекс массива. Т.е. в моем примере выше каталоги modules-contrib и modules-custom из моего бродячего проекта устанавливаются в /tmp/vagrant-puppet/modules-0 и /tmp/vagrant-puppet/modules-1 соответственно.

Вы не должны устанавливать марионеточные модули внутри брандмауэра. Вместо этого установите их в каталог модулей в своем бродяжном проекте в среде хоста.

Вместо того, чтобы устанавливать их один за другим, я бы рекомендовал использовать кукла-библиотекарь (gem install librarian-puppet) и поместив Puppetfile в ваш бродячий проект, в котором перечислены все модули третьей стороны, которые вы хотите, и сообщите библиотекарю-марионетке чтобы поместить их в отдельный каталог модулей из того, который вы используете для своих собственных кукольных модулей. Я использую каталог modules-contrib для сторонних модулей и помещаю свой собственный в modules-custom.

Расскажите библиотекарю, куда его поместить:

librarian-puppet config --local path modules-contrib

См. https://github.com/rodjek/librarian-puppet для макета Puppetfile. Это довольно просто, и позволяет вам смешивать кукольные кузницы и git источники, как вам нравится.

Вы должны добавить папку modules-contrib в свой .gitignore файл (при условии, что вы используете git), и полагаться на управление версиями файла Puppetfile.

Ответ 2

Как он читает из Бродячая документация:

Ассистент Бродячего Кукольника позволяет монтировать локальную папку модулей на виртуальную машину и будет настроить Puppet, чтобы знать о них, автоматически.

Локальная папка относится к папке на главной машине.

И затем:

Путь модуля расширяется относительно папки, содержащей Vagrantfile.

Папка, содержащая ваш VagrantFile, находится на вашей главной машине.

Итак, вы пытаетесь использовать опцию, которая устанавливает путь к папке на хост-машине для управления путём к папке на виртуальной машине.

Вы должны поместить свои модули на хост-машину, а не на виртуальную машину. Вот пример:

HOST MACHINE

~/Dev/mybox/- > базовый путь "mybox" Vagrant VM

~/Dev/mybox/VagrantFile → Файл бродяг, который управляет "mybox"

~/Dev/mybox/puppet/modules → путь к марионеточным модулям, используемым в "mybox"

~/Dev/mybox/puppet/modules/apache → путь к модулю apache для применения в "mybox"

VagrantFile:

  # 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

затем

[email protected]:~$ cd /tmp/vagrant-puppet/modules-0
[email protected]:/tmp/vagrant-puppet/modules-0$ ls
apache

Как вы можете видеть, каталог ~/Dev/mybox/puppet/modules/apache на главной машине был установлен на /tmp/vagrant -puppet/modules-0 на Vagrant VM.

Надеюсь, что это поможет.

Ответ 3

Итак, если вы похожи на меня и смотрели на этот вопрос и ответ, задаваясь вопросом, что в вашем случае было другим, вот что мне не хватало:

Из бродячих документов по обеспечению я взял этот фрагмент:

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"

Не зная рубинов или бродяг очень хорошо, я поддел его под первый фрагмент, предполагая, что он каким-то образом добавит его. Это не сработало.

Тем не менее, работает:

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

Иногда проще найти простые решения.

[EDIT]

Это также помогает понять, что выполнение команды "puppet apply -configprint modulepath" на гостевой виртуальной машине не покажет вам путь к модулю, который марионетка будет использовать, когда он будет вызван Vagrant.