Установка марионеточного модуля из манифеста script
Я использую марионетку для создания виртуальной машины с бродягой (ubuntu).
В моем script мне нужно:
sudo apt-get build-dep python-lxml
Я знаю, что могу установить apt
кукольный модуль, чтобы я мог использовать:
apt::builddep { 'python-lxml': }
Но я не могу найти ссылку на установку модуля из script и как включить/потребовать его. Мне кажется, что марионеточные документы относятся только к установке из кукольного инструмента командной строки
Я также попытался сделать что-то вроде:
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..
любые идеи? направления? Я знаю, что мне не хватает чего-то очевидного, но не могу понять это.
EDIT: Если я предварительно устанавливаю (с puppet module install
из командной строки), apt:builddep
работает отлично. Но мне нужна марионетка для загрузки и установки модуля. Некоторые из других работ также работают для основного варианта использования, но не будут отвечать на мой главный вопрос.
Ответы
Ответ 1
Я столкнулся с этой проблемой. Трюк заключается в загрузке модулей с использованием команды бродячих оболочек перед запуском марионеточного устройства.
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
Порядок здесь важен, и поскольку марионетка не запускает папку /etc/puppet/modules еще не существует.
Причина, по которой я решил, как alonisser, установить модули, используя инструмент марионеточного модуля, вместо того, чтобы использовать папку с модулем с бродячим марионеточным средством, состояла в том, что я не хотел загружать все зависимости модулей я собирался использовать и хранить все эти модули в моем исходном контроле. Запуск этих двух команд приводит к 5 зависимостям, которые в противном случае могли бы находиться в моем хранилище git, занимающем место.
Ответ 2
Вот что я сделал, чтобы команда 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
Ответ 3
Я использую подход, похожий на @brain_bacon - дополнительное осложнение, которое у меня было, заключается в том, что помимо предварительно упакованных модулей, таких как puppetlabs/nodejs, мне нужны были локальные модули относительно моего Vagrantfile. Я не хотел проверять предварительно упакованные модули как часть моего репозитория и не использовать подмодули git из-за проблем, отмеченных @Igor Popov.
Наконец, решение, которое я выбрал, состояло в том, чтобы использовать оболочку script для загрузки модулей, но заставляя их путь в общий каталог между Vagrant VM и хостом и используя .gitignore, чтобы избежать того, что этот путь находится под контролем источника.
Чтобы быть ясным, с этим деревом:
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
Ответ 4
Вы можете установить кукольные модули на главной машине в vagrantdir
:
puppet module --modulepath=./puppet/modules/ install puppetlabs/mysql
Вагрант заботится о том, чтобы установить эту директорию в нужное место.
Таким образом, нет необходимости запускать скрипты, отличные от куклы на node.
Ответ 5
Вдохновленный ответом wtanaka.com, я реализовал решение, подобное ниже, которое, по моему мнению, более читаемо.
1) создайте новый рубиновый файл под названием 'puppet_deps.rb' в той же папке, что и Vagrantfile, с кодом, как показано ниже:
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 вы можете загрузить этот рубиновый файл и использовать его для указания марионеточной зависимости:
# 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')
Ответ 6
Вы можете создать каталог для модулей и добавить модуль apt
, который вы загрузили из кузницы. Это будет modules/apt/*
. Затем вы можете указать этот каталог модуля в Vagrantfile
(module_path
относительно Vagrantfile
):
Vagrant.configure("2") do |config|
config.vm.provision :puppet do |puppet|
puppet.module_path = "modules"
end
end
Для получения дополнительной информации см. документацию .
Ответ 7
Стратегия @brain_bacon работала почти идеально для меня, с одним небольшим предостережением - если модуль уже существует, то инициализация script завершается с ошибкой, останавливая процесс подготовки. Следующая настройка зафиксировала это:
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
Ответ 8
Используя ответы на этот вопрос, я создал этот 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 "[email protected]"
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(" ")
Удаляет куклу из vm, если версия меньше, чем 3.8.7
, затем устанавливает puppet 3.8.7
, а затем устанавливает все модули.
Вероятно, он работает только в блоках debian/ubuntu.