Puppet advent calender 6日目です。昨日は@kijibatoさんによるHieraでの動的リソース定義でした。
External Node Classifiers の概要
External Node Classifiers / ENC とは、 node
宣言をやめて、ホスト名などから適用すべきロールを導出するための仕組みです。
具体例を見るとわかりやすいでしょう。以下のようなRubyのスクリプトがあります。
enc.rb
#!/usr/bin/env ruby
require 'yaml'
certname = ARGV[0]
hostname = certname.split('.').first
role = case hostname
when /^([-_a-z]+)$/, /^([-_a-z]+)\d{3}$/
$1
else
raise("Invalid hostname %s" % hostname)
end
puts YAML.dump({
'classes' => ['base', role],
})
exit 0
これを
$ ./enc.rb web001.example.com
と実行すると、標準出力は以下となるでしょう。
---
classes:
- base
- web
ENCとは、このように、引数にホスト名(cert name)をとり、標準出力に一定のフォーマットのyamlを吐き出すようなスクリプトを置くことで、動的に利用するクラスその他を指定できるような仕組みです。
ENCは、puppet masterで、以下のような設定を追加すれば使えるようになります。
node_terminus = exec
# $vardir/data 配下にデプロイしているとして
external_nodes = $vardir/data/enc.rb
puppet をクライアント実行している場合でも、オプションが存在します。
puppet apply --test --module_path=/vagrant/modules \
--node_terminus=exec \
--external_nodes=/vagrant/enc.rb # Vagrantなら。
具体的な応用例は月曜の午後に......