我正在使用 puppet 来配置 vagrant(基于 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";
}
但是 puppet 退出时出现错误。还有:
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 来处理模块下载和安装。其他一些解决方法也适用于基本用例,但不能回答我的主要问题。
我也遇到了这个问题。诀窍是在 puppet 配置程序运行之前使用 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 配置程序尚未运行文件夹 /etc/puppet/modules 尚不存在。
我决定像alonisser一样,使用puppet模块工具安装模块,而不是使用带有vagrant puppet配置器的模块文件夹,是因为我不想下载我要使用的模块的所有依赖项在我的源代码管理中使用和存储所有这些模块。运行这两个命令会产生 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 的方法 - 我遇到的额外麻烦是,除了像 puppetlabs/nodejs 这样的预打包模块之外,我还需要相对于我的 Vagrantfile 的本地模块。我不想将预打包的模块作为我的存储库的一部分签入,也不想使用 git 子模块,因为 @Igor Popov 指出了问题。
最后我选择的解决方案是使用 shell 脚本下载模块,但强制将它们的路径放入 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
您可以在
vagrantdir
内的主机上安装puppet模块:
puppet module --modulepath=./puppet/modules/ install puppetlabs/mysql
Vagrant 会小心地将这个目录挂载到正确的位置。 因此不需要在节点上运行除了 puppet 本身之外的脚本。
受到 wtanaka.com 答案的启发,我实现了如下所示的解决方案,我认为该解决方案更具可读性。
1)在 Vagrantfile 所在的文件夹下创建一个名为“puppet_deps.rb”的新 ruby 文件,代码如下:
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')
[`我已经从堆栈溢出中删除了所有答案,因为我不想为提取性、剥削性、“人工智能”服务的培训做出贡献。抱歉。]
apt
模块。所以会是
modules/apt/*
。然后你可以在
Vagrantfile
中指定这个模块目录(
module_path
是相对于
Vagrantfile
):
Vagrant.configure("2") do |config|
config.vm.provision :puppet do |puppet|
puppet.module_path = "modules"
end
end
有关更多信息,请参阅
文档。
#!/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
,它会从虚拟机中删除puppet,然后安装
puppet 3.8.7
,然后安装所有模块。它可能只适用于 debian/ubuntu 机器。