web-dev-qa-db-ja.com

マニフェストスクリプトからPuppetモジュールをインストールする

Puppetを使用して、浮浪者(ubuntuベースの)仮想マシンをプロビジョニングしています。私のスクリプトでは、次のことが必要です。

Sudo apt-get build-dep python-lxml

aptpuppet 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 正常に動作します。 しかし、モジュールのダウンロードとインストールを処理するにはパペットが必要です。他の回避策のいくつかは、基本的なユースケースでも機能しますが、私の主な質問には答えません。

35
alonisser

私もこの問題に遭遇しました。コツは、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リポジトリに存在してスペースを占有します。

63
brain_bacon

ここに私が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
14
wtanaka.com

@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
7

vagrantdir内のホストマシンにパペットモジュールをインストールできます。

puppet module --modulepath=./puppet/modules/ install puppetlabs/mysql

Vagrantは、このディレクトリを適切な場所にマウントするよう注意します。そのため、ノードでパペット自体以外のスクリプトを実行する必要はありません。

4
sebastianwagner

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')
2
nybon

この質問からの回答を使用して、このスクリプトを作成しました。

#!/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ボックスでのみ動作します。

1

@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
1
mistertim

モジュール用のディレクトリを作成し、フォージからダウンロードしたaptモジュールを追加できます。したがって、modules/apt/*。次に、このモジュールディレクトリをVagrantfilemodule_pathVagrantfileに対して相対的です):

Vagrant.configure("2") do |config|
  config.vm.provision :puppet do |puppet|
    puppet.module_path = "modules"
  end
end

詳細については、 documentation を参照してください。

1
Gergo Erdosi