5

Puppet で次の問題を解決しようとしています。

複数のノードがあります。各ノードには、クラスのコレクションが含まれています。たとえば、mysqlクラスとwebserverクラスがあります。node1 は Web サーバーのみ、node2 は Web サーバー + mysql です。

ノードに webserver と mysql の両方がある場合、mysql のインストールが webserver の前に行われるように指定したいと思います。

Class[mysql] -> Class[webserver]MySQL のサポートはオプションであるため、依存関係を持つことはできません。

ステージを使用しようとしましたが、クラス間に依存関係が生じるようです。たとえば、次の場合:

Stage[db] -> Stage[web]
class {
'webserver': 
  stage => web ;
'mysql':
  stage => db ;
}

ノードにWebサーバークラスを含めます

node node1 {
  include webserver
}

.. mysql クラスも含まれます! それは私が望むものではありません。

オプションのクラスの順序を定義するにはどうすればよいですか?

編集:ここに解決策があります:

class one {
    notify{'one':}
}

class two {
    notify{'two':}
}

stage { 'pre': }

Stage['pre'] -> Stage['main']

class {
    one: stage=>pre;
    # two: stage=>main; #### BROKEN - will introduce dependency even if two is not included!
}

# Solution - put the class in the stage only if it is defined
if defined(Class['two']) {
    class {
            two: stage=>main;
    } 
}

node default {
    include one
}

結果:

notice: one
notice: /Stage[pre]/One/Notify[one]/message: defined 'message' as 'one'
notice: Finished catalog run in 0.04 seconds

4

1 に答える 1

4

Class[mysql] がオプションの場合は、 defined() 関数を使用して存在するかどうかを確認してみてください。

 if defined(Class['mysq'l]) {
   Class['mysql'] -> Class['webserver']
 }

これをテストするために使用したサンプルコードを次に示します。

class optional {
    notify{'Applied optional':}
}

class afterwards {
    notify{'Applied afterwards':}
}

class another_optional {
    notify{'Applied test2':}
}

class testbed {

    if defined(Class['optional']) {
            notify{'You should see both notifications':}
            Class['optional'] -> Class['afterwards']
    }


    if defined(Class['another_optional']) {
            notify{'You should not see this':}
            Class['another_optional'] -> Class['afterwards']
    }
}

node default {
     include optional
     include afterwards
     include testbed
}

「puppet apply test.pp」で実行すると、次の出力が生成されます。

notice: You should see both notifications
notice: /Stage[main]/Testbed/Notify[You should see both notifications]/message: defined 'message' as 'You should see both notifications'
notice: Applied optional
notice: /Stage[main]/Optional/Notify[Applied optional]/message: defined 'message' as 'Applied optional'
notice: Applied afterwards
notice: /Stage[main]/Afterwards/Notify[Applied afterwards]/message: defined 'message' as 'Applied afterwards'
notice: Finished catalog run in 0.06 seconds

Ubuntu 11.10でパペット2.7.1でテストしました

于 2012-06-19T03:00:53.940 に答える