web-dev-qa-db-ja.com

Puppet:デフォルトノードまたはノードtest2の名前が見つかりませんでした

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',
  }
}
1
txworking

マニフェストノード定義から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::paramsversionパラメータ/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: }
}
3
Shane Madden

シェーンはあなたの問題にアプローチするためのより良い方法で優れた答えを出しましたが、私は「パペットマスターが開始された後、パペットは新しい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.ppnodes/test1.ppのみでした。 nodes/test2.ppを見たことがありません。

この回避策の1つは、nodesディレクトリに新しいファイルを追加した後にtouch site.ppを実行することです。これにより、パペットマスターはsite.ppを再読み取りし、importステートメントを再処理して、新しいファイルを表示します。

ただし、長期的には、シェーンの推奨事項に従い、データをコードから分離することをお勧めします。 importステートメントを必要としないように定義を構造化できる場合は、より良い結果が得られます。それはまだその用途がありますが、多くの点でimportは、もはや関係のない古いPuppetプラクティスの遺物です。

1
asciiphil