大規模なsite.ppファイルで行っていることからhieraで使用できる構造にどのように移行できるかについて頭を抱えています。人形のドキュメントを読んだかどうか、はっきりとわかりません。正確にhieraデータがどのように評価され、いつ画像に収まるかはわかりません。最近、puppet 2.7.xから3.3.xにアップグレードしました。これには標準パッケージの一部としてhieraが含まれているので、セットアップを読みやすく/理解しやすくするため、これを最後に使用したいと思いました。
システムをサポートするためにいくつかの外部組織を使用しています。これには、各組織に固有のシステムの構成が含まれます。私のsite.ppの上部には、以下のような構造があります。各組織を確実に識別する方法で構成および発行されたclientcertファクトと一致する正規表現に基づいて、各組織のファクトを設定するために使用します。
# match organization
case $::clientcert {
/.*example1.org/ :
{ $snmp_ro_community='...'
$snmp_location='Example Org 1'
... }
/.*example2.org/ :
{ $snmp_ro_community='...'
$snmp_location='Example Org 2'
... }
/.*example3.org/ :
{ $snmp_ro_community='...'
$snmp_location='Example Org 3'
... }
/.*example4.org/ :
{ $snmp_ro_community='...'
$snmp_location='Example Org 4'
... }
}
Hiera.yamlファイルでパターンマッチングを行う方法が見当たらない例を参照しています。私は明らかな何かを見逃しているに違いないと思います。
私はこれについての慣習に頼りたくありません。私は、これが組織とシステムを正しく識別し、強力な暗号化を使用して確認されていると確信しているため、クライアント証明書を使用することを好みます。ある組織に他の組織に価値を与えたくありません。
このために、YAMLファイルの階層を設定できます。 hiera.yaml
から始めましょう:
---
:hierarchy:
- "Host/%{fqdn}"
- "domain/%{domain}"
- "env/%{::environment}"
- "ops/%{operatingsystem}"
- "os/%{osfamily}"
- common
:backends:
- yaml
:yaml:
:datadir: /etc/puppet/data
フォルダー構造については、facter -y
の出力で確認できる任意のファクトを使用できます。例えばCPUアーキテクチャごとにhiera構成ファイルを持つことができます。次に、行を追加します
- "Arch/%{::architecture}"
hieraはArch/AMD64.yaml
を見てみましょう
Hieraをデバッグするには、現在の事実をダンプできます。
$ facter -y > myhost.yaml
そして、いくつかの変数を探します:
$ hiera -y myhost.yml snmp_location --debug
Hieraはすべてのルールを調べ、変数を見つけようとします。
DEBUG: Mon Nov 11 11:00:23 +0100 2013: Hiera YAML backend starting
DEBUG: Mon Nov 11 11:00:23 +0100 2013: Looking up snmp_location in YAML backend
DEBUG: Mon Nov 11 11:00:23 +0100 2013: Looking for data source Host/myhost.example.com
...
DEBUG: Mon Nov 11 11:00:23 +0100 2013: Looking for data source ops/Ubuntu
DEBUG: Mon Nov 11 11:00:23 +0100 2013: Cannot find datafile /etc/puppet/data/ops/Ubuntu.yaml, skipping
$::clientcert
を一致させるには、トップドメインを別のファクトに抽出し、cert/example1.org.yaml
のyamlファイルを作成して、次のようなものを含めるとよいでしょう。
---
snmp_location: 'Example Org 1'
Hiera関数呼び出しをまったく含まないモジュールがある場合でも、パラメータ値を簡単に設定できることを知っておくのは良いことです。
class snmp (
$location = 'foo',
) {
# ...
}
いくつかのhiera構成:
---
snmp::location: 'Example Org 1'
同様の理由で同じものを探していました。そして、githubでhiera backednが役立つ jjulien/hiera-regex であることがわかりました。プロジェクト自体のreadmeファイルの例として、次のようにグループ化を処理する新しいバックエンドを構成する必要があります。
/etc/puppet/hiera.yaml:
:backends:
- regex
- yaml
:yaml:
:datadir: /var/lib/hiera
:regex:
:datadir: /var/lib/hiera
:hierarchy:
- "fqdn/%{::fqdn}"
- common
/var/lib/hiera/fqdn/fqdn.regex:
---
- '^mailin-trusted.example.org$':
postfix::smtp_relay: 'mailout-dmz.example.org'
- '^mailout.*':
postfix::smtp_relay: 'smtp.mailgun.org'
- '^mailin.*':
postfix::smtp_relay: 'localhost'
しかし、puppet-usersのいくつかの投稿とpuppetlabsのビデオで、分類にhieraを使用することに対して警告が表示されています。特に、ノードマネージャーを備えたPE 3.7のリリースでは特にそうです。