私が説明しようとしているユースケースは、すべてのノード(例ではベースノードのクラスストリップダウン)に含めることができるデフォルト構成でいくつかのアイテム(eq mysqld service)を宣言し、それでもこの同じアイテムをオーバーライドできる場合です。特定のノード(myserver.localなど)に含まれる特定のクラス(例:mysql :: server)
以下の例でこのユースケースを説明しました。ここでは、すべてのノードでmysqlサービスを無効にし、特定のノードでアクティブにします。しかしもちろん、Service [mysql]が2回含まれているため、Puppetの解析は失敗します。そしてもちろん、クラスmysql :: serverはクラスstripdownの子であるという関係はありません
Service ["mysql"]をオーバーライドする方法、またはメインとしてマークする方法などはありますか?仮想アイテムと実現機能について考えていましたが、アイテムを複数回適用することしかできず、再定義したりオーバーライドしたりすることはできません。
# In stripdown.pp :
class stripdown {
service {"mysql": enable => "false", ensure => "stopped" }
}
# In mysql.pp :
class mysql::server {
service { mysqld:
enable => true,
ensure => running,
hasrestart => true,
hasstatus => true,
path => "/etc/init.d/mysql",
require => Package["mysql-server"],
}
}
# Then nodes in nodes.pp :
node basenode {
include stripdown
}
node myserver.local inherits basenode {
include mysql::server` # BOOM, fails here because of Service["mysql"] redefinition
}
「このコンポーネントをあるノードでは一方向に動作させ、別のノードでは別の動作をさせたい」と自分が気付いたときは、クラス定義の条件または置換を介して、変数によって駆動される定義を見ている必要があるでしょう。テンプレートで。
残念ながら、あなたの例は、継承を使用しようとしていることを示しています。これは、パペットでかなりひどく壊れており、壊れるものの1つがノードでの変数の再定義であるため、ここで多くの悲しみを引き起こします。
更新:古い回答の詳細は廃止されました
2.7の時点で私がやっていることは、クラスで使用されるすべての変数がグローバル変数ではなく、適切なデフォルトが設定されたパラメーターであることを確認することです。あなたまだPuppetに組み込まれている継承を使用したくないが、ノード定義から直接特定の変数をオーバーライドできるようになり、手動で継承のプリミティブ形式を使用することもできます。あるクラスに変数を取得させてから、それらを別のクラスの呼び出しに渡すことによって。たとえば、ノード定義には次のようになります。
node experimental_server {
# This will still call class 'databases', but will install Postgresql and not Mysql
# as a default. You can still override it the same way as with 'databases'
class { 'mydept::nextgeneration': },
}
node server_with_mysql {
class { 'databases':
mysql_enabled => true,
}
}
node server_with_no_db {
class { 'databases': # this installs only the clients }
}
class databases (
# By default, install no servers, just clients
$pgsql_enabled => false,
$mysql_enabled => false
)
{
...
}
class mydept::nextgeneration (
# If not explicitly overridden, an undef value passed as a parameter to a class
# assumes the default value in that class
$mysql_enabled => undef,
$pgsql_enabled => true
)
{
class { 'databases':
mysql_enabled => $mysql_enabled,
pgsql_enabled => $pgsql_enabled,
}
}
コメント提供者が指摘したように、Hieraと呼ばれる気の利いた新機能もあります。これにより、デフォルトを別のデータ構造にオフロードできます。Puppet3.2が利用可能な場合は、それを調べる必要があります。残念ながら、多くのLinuxディストリビューションはまだ2.6または2.7で出荷されているため、これはまだオプションではない可能性があります。
以前の回答の詳細は以下に保存されています
私が通常このようなものを処理する方法は、変数の長いリストに対するデフォルトの割り当て以外は何もない「default_parameters.pp」ファイルを作成することです。この場合、この場合、$mysql_enabled = false
のような行が含まれます。このファイルは、モジュールのinit.ppファイルに含まれます。次に、ノード定義ファイルは次のようになります。
import "mymodule"
node myserver.local { # NOTE: no inheritance!
$mysql_enabled = true
include mysql::server
}
node otherserver.local {
include mysql::server
}
次に、mysql :: serverのクラス定義で、$mysql_enabled
がtrueかどうかを確認し、trueの場合は、enable
とensure
で selector を使用します。
これは、ノードmyserver.localが何かを継承するとすぐに壊れます。これは、継承時に変数の値がロックされ、ノード定義内でそれ以上変更しても効果がないためです。それ以外の場合は、この手法を使用して、個々のコンポーネントを使用します。複数のクラスを生成せずに異なる動作をします。
継承が絶対に必要であるが、mysqlが有効になっているマシンのリストが少ない場合は、別のルートを使用できます。ノード定義で変数を設定する代わりに、$fqdn
からセレクターを構築し、デフォルトで無効にします。選択したfqdnが有効になっています。
これを試してみてください:
# In stripdown.pp :
class stripdown {
service { "mysql":
enable => "false",
ensure => "stopped"
}
}
# In mysql.pp :
class mysql::server {
if defined(Service["mysql"]) {
Service["mysql"] {
enable => true,
ensure => running,
hasrestart => true,
hasstatus => true,
path => "/etc/init.d/mysql",
require => Package["mysql-server"],
}
} else {
service { "mysql":
enable => true,
ensure => running,
hasrestart => true,
hasstatus => true,
path => "/etc/init.d/mysql",
require => Package["mysql-server"],
}
}
}
# Then nodes in nodes.pp :
node basenode {
include stripdown
}
node myserver.local inherits basenode {
include mysql::server
}
もちろん、これには、Package ["mysql-server"]がすでに他の場所で定義されているという警告があります。これは、require
ステートメントが原因でそれなしで記述されたとおりに失敗します。
私が見つけた他のエラーは、オプションの後にスペースが多すぎることでした。スタンザ内のオプションは、最長のオプション名より1スペース以内で整列する必要があります。
あなたが見たくなるかもしれない一つのことは、リソースの複数の定義を回避するための仮想リソースです。そのトピックに関するドキュメントは次の場所にあります: http://reductivelabs.com/trac/puppet/wiki/VirtualResources
もちろん、もう1つの方法は、mysqlを実行しないホストごとにノードオブジェクトを作成し、そこにストリップされたクラスをロードすることです。
これを試してみてください
# In stripdown.pp :
class stripdown {
service { "mysql":
enable => "false",
ensure => "stopped"
}
}
# In mysql.pp :
class mysql::server inherits stripdown {
Service["mysqld"] {
enable => true,
ensure => running,
hasrestart => true,
hasstatus => true,
path => "/etc/init.d/mysql",
require => Package["mysql-server"],
}
}
# Then nodes in nodes.pp :
node basenode {
include stripdown
}
node myserver.local inherits basenode {
include mysql::server
}