最初に人形に特定のことをさせる方法はありますか?たとえば、パッケージをインストールする前に、すべてのサーバーにRPMをインストールしてyumリポジトリ(IUSコミュニティ)を追加する必要があります。
すべてのサーバーにリポジトリがインストールされていることを確認したい場合は、このようなものをお勧めします
node default {
include base
}
class base {
yumrepo { "IUS":
baseurl => "http://dl.iuscommunity.org/pub/ius/stable/$operatingsystem/$operatingsystemrelease/$architecture",
descr => "IUS Community repository",
enabled => 1,
gpgcheck => 0
}
}
次に、base
を拡張するすべてのノードについて、次のように言うことができます。
class foo {
package { "bar": ensure => installed, require => Yumrepo["IUS"] }
}
これにより、
bar
はインストールされませんステージはこれを処理でき、特定のyum repo依存関係も処理できますが、一般的に関係を宣言する方が適切です。
Yumrepo <| |> -> Package <| provider != 'rpm' |>
人形マニフェスト。
node default {
Yumrepo <| |> -> Package <| provider != 'rpm' |>
}
これにより、すべてのyumrepoタイプが、プロバイダーとして「rpm」を持たないパッケージの前に処理されるようになります。後者の除外は、(たとえば)epel-release RPMパッケージを使用して、yumリポジトリをインストールできるようにするためのものです。
(私がほぼ答えた後でこの質問を見つけました 同じ ..だから私の答えもここに当てはまると思ったので、繰り返す価値があります(2つの場所で回答する方が安全です。)
私が理解している限り、これはまさに stages の目的であり、クラスの実行をグループ化して順序付けすることができます。 「ステージ」を使用して、APTをDebianサーバーで更新および構成します。これは、YUMで行うことと非常によく似ています。
まず、「yum」ステージをトップレベル(「ノード」の上)で宣言し、「yum」ステージのクラスが「メイン」クラスの前に実行されるようにします。
stage { 'yum' : before => Stage['main'] }
次に、ステージをクラスに割り当てます。これは、ノード定義で直接行うことができます。
node default {
class { 'yumrepos' : stage => yum }
include packages
}
Tags を使用できます。これにより、リポジトリインストーラーにfirstrun
などのタグを付けることができます。
次に実行します
puppetd --tags firstrun
そして、タグに一致するモジュール/ステートメントのみを実行します。
使用する必要がある重要なことは、 require キーワード-「1つ以上のクラスを評価し、必要なクラスを依存関係として追加する」です。
Aptリポジトリを使用した例は次のとおりです。
class installcustompackages {
# make sure we have the repository file and public key
file { "/etc/apt/sources.list.d/myrepo.list":
source => "puppet://puppet/files/etc/apt/sources.list.d/myrepo.list",
ensure => present;
"/etc/apt/trusted.gpg":
source => "puppet://puppet/files/etc/apt/trusted.gpg",
}
# do an update whenever the list or trusted key file change
exec { "/usr/bin/apt-get update":
alias => "aptgetupdate",
require => [ File["/etc/apt/sources.list.d/myrepo.list"], File["/etc/apt/trusted.gpg"] ],
subscribe => [ File["/etc/apt/sources.list.d/myrepo.list"], File["/etc/apt/trusted.gpg"] ],
refreshonly => true;
}
package { "mypackage":
ensure => latest,
require => Exec["aptgetupdate"];
"mypackage2":
ensure => latest,
require => Exec["aptgetupdate"];
}
service { "myservice":
enable => false,
require => Package[mypackage];
}
}
( このパペットのブートストラップの例 から改作)。
したがって、各ステージで前のステージを最初に実行する必要があることを確認できます。ファイルの保存場所がわからないので、これをyumに適用する方法を説明します。
Puppetは設定を上から下に読み取ります。そのため、クラスに最初にyumリポジトリを含むクラスを含めると、このリポジトリは何よりも先に追加されます。
パッケージでrequire設定を使用する場合、次のように、パッケージを追加する前に必要なリソースタイプが存在することを確認します。
node 'yournode.domain.com' {
package { "bar": ensure => installed, require => Yumrepo["IUS"] }
yumrepo { "IUS":
baseurl => "http://dl.iuscommunity.org/pub/ius/stable/$operatingsystem/$operatingsystemrelease/$architecture",
descr => "IUS Community repository",
enabled => 1,
gpgcheck => 0
}
}
上記のコードは、パッケージを追加する前にリポジトリを追加します。
このようなものが私にとってうまくいきました:
yumrepo { A:
descr => "A repo",
baseurl => '',
enabled => 1,
gpgcheck => 1,
gpgkey => "",
priority => 3
}
yumrepo { B:
descr => "B repo",
baseurl => '',
enabled => 1,
gpgcheck => 1,
gpgkey => "",
priority => 3
}
yumrepo { C:
descr => "C repo",
baseurl => '',
enabled => 1,
gpgcheck => 1,
gpgkey => "",
priority => 3;
}
Package {
require => [Yumrepo[A], Yumrepo[B], Yumrepo[C]]
}
Mysite.ppにこのようなものを含めました。このように、パペットモジュールは、yumリポジトリへの参照がありません。