UbuntuサーバーにPuppet3.1.1をインストールしました。
マニフェストフォルダは次のようになりました。
├── nodes
│ └── test1.pp
└── site.pp
Site.ppの内容は次のとおりです。
# site.pp
import "nodes/*.pp"
ノードtest1は正常に機能しました。
次に、test2.pp
という名前の新しいファイルを作成しました。内容はノード名以外はtest1.ppと同じで、nodesフォルダーに追加しました。
したがって、マニフェストフォルダは次のようになります。
├── nodes
│ ├── test1.pp
│ └── test2.pp
└── site.pp
次に、ノードtest2でpuppet agent --test
を実行しました。
エージェントはパペットマスターとSSLキーを交換できましたが、エラーメッセージが表示されました。
Could not find default node or by name with test2
新しいtest2.pp
ファイルを作成せず、コンテンツをtest1.pp
ファイルに追加しただけでは、エラーは表示されません。
そのため、Puppetマスターが起動した後、Puppetは新しいppファイルを動的にインポートしないと思います。
個々のppファイルでノードを定義して動的にインポートすることは可能ですか?
提案をいただければ幸いです。
2つのppファイルの内容:
node 'test1' {
include tmp::params
tmp::gtp { 'node1':
name => 'node1',
version => '6.0.0.0',
ip => '168.1.193.97',
port => '1255',
}
}
node 'test2' {
include tmp::params
tmp::gtp { 'node2':
name => 'node2',
version => '6.0.0.0',
ip => '168.1.193.98',
port => '1255',
}
}
マニフェストノード定義からHieraに移行することをお勧めします。定義された型がノードから直接呼び出されないようにするには、少し調整する必要がありますが、カタログで複数回使用されていないように見えるため、クラスへの変換は正常に機能するはずです。
したがって、このようなhiera.yaml
を使用します。
---
:backends:
- yaml
:hierarchy:
- '%{::clientcert}'
- 'os-%{::osfamily}'
- common
:yaml:
:datadir: /etc/puppet/hieradata
そして、site.pp
と:
hiera_include(classes)
..ノードは/etc/puppet/hieradata
のYAMLファイルから読み取られます。たとえば、Puppetにレポートするすべてのノードにtmp::params
が必要であると言いますが、特定のノードだけにtmp::gtp
が必要な場合もあります。また、version
パラメーターを一元的に定義したいが、他のパラメーターはノードごとに設定したままにしておきます。したがって、tmp::params
とversion
パラメータ/etc/puppet/hieradata/common.yaml
を配置します。
classes:
- tmp::params
tmp::gtp::version: 6.0.0.0
次に、ノードごとにファイルが作成されます。
/etc/puppet/hieradata/test1.yaml
:
classes:
- tmp::gtp
tmp::gtp::name : node1
tmp::gtp::ip : 168.1.193.97
tmp::gtp::port : 1255
/etc/puppet/hieradata/test2.yaml
:
classes:
- tmp::gtp
tmp::gtp::name : node2
tmp::gtp::ip : 168.1.193.98
tmp::gtp::port : 1255
はい、サービスを再起動せずにHieraファイルへの変更を取得します。あなたが必要なものについてのように見えますか?
編集:Hieraを使用して定義されたタイプの複数のインスタンスを設定するには、次のようにします。
/etc/puppet/hieradata/test1.yaml
:
classes:
- gtpsetup
gtp_instances:
- node1_instance1
- node1_instance2
gtp_instanceconfig:
node1_instance1:
ip : 168.1.193.97
port : 1255
version : 5.3.2.1
node1_instance2:
ip : 168.1.193.97
port : 1268
version : 6.0.0.0
/etc/puppet/modules/gtpsetup/manifests/init.pp
:
class gtpsetup {
gtp_instances = hiera('gtp_instances')
gtp_instanceconfig = hiera('gtp_instanceconfig')
define gtp_instance {
# this is using your existing defined type, but you can just move the stuff it's doing to here.
tmp::gtp { $title:
name => $title,
version => gtp_instanceconfig[$title]['version'],
ip => gtp_instanceconfig[$title]['ip'],
port => gtp_instanceconfig[$title]['port'],
}
}
gtp_instance { $gtp_instances: }
}
シェーンはあなたの問題にアプローチするためのより良い方法で優れた答えを出しましたが、私は「パペットマスターが開始された後、パペットは新しいppファイルを動的にインポートしないと思います」と述べたいと思います。
そういうことです。 Puppetが起動すると、すべての構成ファイルを読み取り、変更がないか監視を開始します。これらのファイルの1つのコンテンツが更新されると、Puppetはファイルを再読み取りします。 Puppetには、必要なときに参照するファイルの標準的な場所のセットもあります。そのため、監視しているファイルのノードに新しいクラスfoo::bar
を追加すると、でfoo/manifests/bar.pp
(またはfoo/manifests/bar.rb
)という名前のファイルが検索されます。起動時にそのファイルを必要としなかった場合でも、その$modulepath
。
重要なことに、import
ディレクティブは、それらが含まれているファイルが解析されたときにのみ評価されます。 puppet masterが起動すると、site.pp
ファイルを読み取り、import
ステートメントを確認し、nodes/test1.pp
のみを検出したため、変更を監視したファイルはsite.pp
とnodes/test1.pp
のみでした。 nodes/test2.pp
を見たことがありません。
この回避策の1つは、nodes
ディレクトリに新しいファイルを追加した後にtouch site.pp
を実行することです。これにより、パペットマスターはsite.pp
を再読み取りし、import
ステートメントを再処理して、新しいファイルを表示します。
ただし、長期的には、シェーンの推奨事項に従い、データをコードから分離することをお勧めします。 import
ステートメントを必要としないように定義を構造化できる場合は、より良い結果が得られます。それはまだその用途がありますが、多くの点でimport
は、もはや関係のない古いPuppetプラクティスの遺物です。