Puppetを使用して、浮浪者(ubuntuベースの)仮想マシンをプロビジョニングしています。私のスクリプトでは、次のことが必要です。
Sudo apt-get build-dep python-lxml
apt
puppet module をインストールできるので、次を使用できます。
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";
}
しかし、人形はこのエラーで終了しました。そしてまた:
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
正常に動作します。 しかし、モジュールのダウンロードとインストールを処理するにはパペットが必要です。他の回避策のいくつかは、基本的なユースケースでも機能しますが、私の主な質問には答えません。
私もこの問題に遭遇しました。コツは、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のように、Vagrant puppetプロビジョニングツールでモジュールフォルダーを使用する代わりにpuppetモジュールツールを使用してモジュールをインストールすることにしたのは、これからしようとしているモジュールのすべての依存関係をダウンロードする必要がなかったからですソース管理でこれらのモジュールをすべて使用して保存します。これらの2つのコマンドを実行すると、5つの依存関係が発生し、それ以外の場合はgitリポジトリに存在してスペースを占有します。
ここに私がpuppet module install
コマンドは最大で1回実行されます。
$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に関連するローカルモジュールが必要でした。 @Igor Popovによって指摘された問題のため、事前にパッケージ化されたモジュールをリポジトリの一部としてチェックインしたり、gitサブモジュールを使用したりしませんでした。
最後に、私が選んだ解決策は、シェルスクリプトを使用してモジュールをダウンロードすることでしたが、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 module --modulepath=./puppet/modules/ install puppetlabs/mysql
Vagrantは、このディレクトリを適切な場所にマウントするよう注意します。そのため、ノードでパペット自体以外のスクリプトを実行する必要はありません。
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ファイルをロードし、それを使用してパペットの依存関係を指定できます。
# 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')
この質問からの回答を使用して、このスクリプトを作成しました。
#!/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
より低い場合、vmからpuppetを削除し、puppet 3.8.7
をインストールしてから、すべてのモジュールをインストールします。
おそらくdebian/ubuntuボックスでのみ動作します。
@brain_baconの戦略は、私にとってはほぼ完璧に機能しましたが、1つの小さな注意点があります。モジュールが既に存在する場合、プロビジョニングスクリプトが失敗し、プロビジョニングプロセスが停止します。次の調整によりこれが修正されました。
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
モジュール用のディレクトリを作成し、フォージからダウンロードしたapt
モジュールを追加できます。したがって、modules/apt/*
。次に、このモジュールディレクトリをVagrantfile
(module_path
はVagrantfile
に対して相対的です):
Vagrant.configure("2") do |config|
config.vm.provision :puppet do |puppet|
puppet.module_path = "modules"
end
end
詳細については、 documentation を参照してください。