Бродячий кукольный модульный путь
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.