web-dev-qa-db-ja.com

Puppet:外部の子クラスをオーバーライド/再定義する方法(ユースケースと例の詳細)

私が説明しようとしているユースケースは、すべてのノード(例ではベースノードのクラスストリップダウン)に含めることができるデフォルト構成でいくつかのアイテム(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             
}
6
Alex F

「このコンポーネントをあるノードでは一方向に動作させ、別のノードでは別の動作をさせたい」と自分が気付いたときは、クラス定義の条件または置換を介して、変数によって駆動される定義を見ている必要があるでしょう。テンプレートで。

残念ながら、あなたの例は、継承を使用しようとしていることを示しています。これは、パペットでかなりひどく壊れており、壊れるものの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の場合は、enableensureselector を使用します。

これは、ノードmyserver.localが何かを継承するとすぐに壊れます。これは、継承時に変数の値がロックされ、ノード定義内でそれ以上変更しても効果がないためです。それ以外の場合は、この手法を使用して、個々のコンポーネントを使用します。複数のクラスを生成せずに異なる動作をします。

継承が絶対に必要であるが、mysqlが有効になっているマシンのリストが少ない場合は、別のルートを使用できます。ノード定義で変数を設定する代わりに、$fqdnからセレクターを構築し、デフォルトで無効にします。選択したfqdnが有効になっています。

3
Zed

これを試してみてください:

# 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スペース以内で整列する必要があります。

2
Jeremy Bouse

あなたが見たくなるかもしれない一つのことは、リソースの複数の定義を回避するための仮想リソースです。そのトピックに関するドキュメントは次の場所にあります: http://reductivelabs.com/trac/puppet/wiki/VirtualResources

もちろん、もう1つの方法は、mysqlを実行しないホストごとにノードオブジェクトを作成し、そこにストリップされたクラスをロードすることです。

0

これを試してみてください

# 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
}
0
rodjek