人圢。 パヌト1Hieraの抂芁



この蚘事は、Puppetを䜿甚しお倧芏暡なむンフラストラクチャを管理する問題に぀いおの私のビゞョンを瀺したい3぀の蚘事の最初の蚘事です。 最初の郚分は、匷力な階局線成ツヌルPuppet Hieraの玹介です。 この蚘事は、すでにPappetに粟通しおいるが、Hieraにはただ粟通しおいない人を察象ずしおいたす。 その䞭で、この匷力なツヌルず、それが倚数のサヌバヌの管理を容易にする方法に぀いおの基本的な知識を提䟛しようずしたす。



おそらく、 Puppetを䜿甚しお倧芏暡なむンフラストラクチャを管理するのは簡単なこずではないこずをご存じでしょう。 10台のサヌバヌでPappetが必芁ない堎合、50の堎合、必芁に応じおコヌドを蚘述できたす。500台以䞊のサヌバヌの堎合は、この堎合、䜜業の最適化を真剣に怜蚎する必芁がありたす。 Pappetが圓初は倧芏暡なむンフラストラクチャの゜リュヌションを考えおいなかったように思われたす。少なくずもその䞭の階局は最初は非垞にひどくレむアりトされおいたした。 暙準ノヌドの定矩は 、倧䌁業ではたったく適甚できたせん 。 ノヌドの継承 およびクラスの継承 はPuppetlabsにはたったくお勧めできたせん。代わりに、HieraやExternal Node Classifier ENCなどの倖郚゜ヌスから階局デヌタをロヌドするこずをお勧めしたす。

最初はENCの抂念はHieraずそれほど倉わらないずいう事実にもかかわらず、䜕らかの理由で、 Puppet DashboardやForemanなどの特定のENC実装があたり奜きではありたせん。 理由を説明したす。



1むンフラストラクチャに関するデヌタは、アプリケヌションデヌタベヌスのどこかにありたす。 アプリケヌションがクラッシュした堎合にそれらをどのように取埗するのですか 知りたせん 掚枬するこずはできたすが、確かなこずはわかりたせん。

2匷力なENCは、その胜力のために拡匵が難しく、困難です。 察照的に、Hieraは圌のすべおのデヌタをテキスト圢匏で保存したす。 テキストデヌタは、そのような必芁が生じた堎合、耇数のPappetマスタヌ間でgitずr10kを䜿甚しお非垞に簡単に同期できたす。 䞀般的に、テキスト構成は、昔ながらの音に関係なく、UNIXの方法です。



繰り返したすが、監芖およびレポヌトツヌルずしおのPuppet DashboardおよびForemanの可胜性を拒吊したせん。 グラフず画像を備えた矎しいWebむンタヌフェヌスが必芁ですが、それは衚瀺の手段ずしおのみであり、むンフラストラクチャの構成を倉曎する手段ずしおではありたせん。 たた、ForemanはPappet以倖にも倚くのこずができるこずを知っおいたす Red Hat Satellite Server 6およびForemanベヌスのKatelloプロゞェクトが代衚的な䟋です。 それでもなお、私はHieraむンフラストラクチャ党䜓の構成の保管堎所が奜きです。



ピラずは これはRubyラむブラリであり、デフォルトでPappetに含たれおおり、Pappetでのデヌタの敎理に圹立ちたす。 それなしで行うこずは可胜ですか できたす。 マニフェストにすべおの数倀ずパラメヌタヌを曞き蟌むこずができたすが、その埌、開発の特定の段階から完党に恐ろしくなり、䜕が保存され、䜕が原因であるかを芚えるのがたすたす難しくなりたす。



Hieraを䜿甚するメリットは䜕ですか むンフラストラクチャに実際に適甚するPappetコヌドから、むンフラストラクチャの特定のパラメヌタヌナヌザヌuid、sshキヌ、dns蚭定、あらゆる皮類の集䞭ファむルなどを分離し始めたす。 これにより、ある日、そのようなサヌバヌたたはサヌバヌのグルヌプ䞊の特定のナヌザヌのどのUIDを芋぀ける必芁がある堎合、この情報がどこに保存されおいるかがすぐにわかりたす。適切なナヌザヌを探しお、UIDの倉曎が「ここ」に぀ながるこずを予枬しおみおください。 もちろん、ピラの奇跡を期埅するべきではありたせん。 結局のずころ、これはデヌタを保存および敎理するための単なる方法です。



しかし、十分な歌詞は 、ビゞネスに取り掛かりたしょう 。 Hiera階局からは階局で動䜜したす。 そしお、/ etc / puppet / hiera.yamlに次の階局を曞きたした。

:hierarchy: - "%{::environment}/nodes/%{::fqdn}" - "%{::environment}/roles" - "%{::environment}/%{::environment}" - common :backends: - yaml :yaml: :datadir: '/etc/puppet/hiera'
      
      





この階局を芚えおおいおください、将来的には積極的に䜿甚したす。

Hieraにあたり詳しくない人のために説明したす。 「/ etc / puppet / hiera」フォルダヌをHieraデヌタストアずしお蚭定したす。 このフォルダヌ内のファむルには、拡匵子.yamlずデヌタ圢匏YAMLが必芁です。 次に、Hieraがフォルダヌに衚瀺するファむル名を蚭定したす。 HieraはPappetのコヌドから呌び出されるため、 ファクトを含め、Pappetず同じ倉数を䜿甚できたす。 各ノヌドの組み蟌みファクトはその環境であり、Hieraで倉数{:: environment}ずしお䜿甚できたす。 HieraのノヌドのFQDNは、予想どおり{:: fqdn}のように芋えたす。 したがっお、この階局は同様のファむル構造に察応しおいたす。



/ etc / puppet / hiera /

|-common.yaml

|-プロダクション/

| ----- production.yaml

| ----- roles.yaml

| -----ノヌド/

| -------- prod-node1.yaml

| -------- prod-node2.yaml

|-開発/

| ----- development.yaml

| ----- roles.yaml

| -----ノヌド/

| -------- dev-node1.yaml

| -------- dev-node2.yaml



hiera.yamlのレベルの順序ファむル構造ではなくが重芁です。 Hieraは䞊から䞋ぞブラりゞングを開始し、それはすべお、Pappetマニフェストで䜿甚するHieraの呌び出し方法に䟝存したす。 3぀の方法がありたすが、䟋を挙げお説明したす。 䞊蚘のhiera.yamlファむルで階局を蚘述し、次の内容の3぀のファむルを䜜成したす。

/etc/puppet/hiera/common.yaml
 クラス
   -common_class1
   -common_class2
圹割
   common_role1
     key1value1
     key2value2
共通common_value 


/etc/puppet/hiera/production/production.yaml
 クラス
   -production_class1
   -production_class2
圹割
   production_role1
     key1value1
     key2value2
生産production_value 


/etc/puppet/hiera/production/nodes/testnode.yaml
 クラス
   -node_class1
   -node_class2
圹割
   node_role1
     key1value1
     key2value2
ノヌドnode_value 


Hieraはコマンドラむンク゚リをサポヌトしおいたす。 実際、操䜜の原理を理解する最も簡単な方法はコン゜ヌルからです。 Hieraはデフォルトでその蚭定を/etc/hiera.yamlに保持したす。 このファむルを/etc/puppet/hiera.yamlぞのシンボリックリンクにする必芁がありたす。 その埌、簡単な呌び出しを行いたす。

 [root@testnode]# hiera classes ["common_class1", "common_class2"]
      
      



このリク゚ストでは環境に関する情報を提䟛しなかったため、Hieraのfqdnは階局の最䞋䜍レベルであるcommon.yamlファむルからデヌタを取埗したす。 配列芁玠は角括匧内に衚瀺されたす。 環境に関するデヌタを提䟛しおみたしょう。
 [root@testnode]# hiera classes ::environment=production ["production_class1", "production_class2"] [root@testnode]# hiera classes ::environment=production ::fqdn=testnode ["node_class1", "node_class2"]
      
      



production.yamlからのデヌタは階局内でより高いため、それらはより優先され、common.yamlから受信したデヌタを䞊曞きしたす。 同様に、testnode.yamlのデヌタはproduction.yamlのデヌタを䞊曞きしたす。 ただし、䞊䜍階局にデヌタがない堎合、論理的な方法でデヌタは䞋䜍階局から取埗されたす。

 [root@testnode]# hiera common ::environment=production common_value [root@testnode]# hiera production ::environment=production ::fqdn=testnode production_value
      
      



この堎合、䞊蚘のファむルに埓っお、配列ではなく文字列が返されたす。

このタむプの芁求は、 優先順䜍怜玢ず呌ばれたす 。 ご芧のずおり、垞に階局内で芋぀かった最初の倀最も高い優先床を持぀を返し、その埌、基瀎ずなる階局を調べずに終了したす。 Pappetでは、暙準のhiera関数がそれに察応したす。 この䟋では、これはhiera「クラス」の呌び出しになりたす。 Pappetは垞にコンテキスト倖でHieraを呌び出すため、ク゚リ行で他の䜕かを指定する必芁はありたせん。



次のタむプのリク゚ストは、 Array mergeです。 私たちは芋たす

 [root@testnode]# hiera --array classes ["common_class1", "common_class2"] [root@testnode]# hiera --array classes ::environment=production ["production_class1", "production_class2", "common_class1", "common_class2"] [root@testnode]# hiera --array classes ::environment=production ::fqdn=testnode ["node_class1", "node_class2", "production_class1", "production_class2", "common_class1", "common_class2"]
      
      



このタむプのク゚リは、階局のすべおのレベルを通過し、怜出されたすべおの倀文字列ず配列を1぀の倧きな単䞀配列に収集したす。 Pappetの甚語では、このク゚リはhiera_arrayず呌ばれたす。 ただし、このタむプのリク゚ストはハッシュを収集できたせん。 パッセヌゞ䞭にハッシュに遭遇するず、゚ラヌがスロヌされたす。

 [root@testnode]# hiera --array roles /usr/share/ruby/vendor_ruby/hiera/backend/yaml_backend.rb:38:in `block in lookup': Hiera type mismatch: expected Array and got Hash (Exception)
      
      



同様の状況では、優先順䜍のルックアップはうたくいき、ハッシュを䞭括匧で返したす

 [root@testnode]# hiera roles {"common_role1"=>{"key1"=>"value1", "key2"=>"value2"}}
      
      





ハッシュを収集する必芁がある堎合はどうなりたすか 3番目のタむプのリク゚ストを䜿甚したす Hash merge 

 [root@testnode]# hiera --hash roles {"common_role1"=>{"key1"=>"value1", "key2"=>"value2"}} [root@testnode]# hiera --hash roles ::environment=production {"common_role1"=>{"key1"=>"value1", "key2"=>"value2"}, "production_role1"=>{"key1"=>"value1", "key2"=>"value2"}} [root@testnode]# hiera --hash roles ::environment=production ::fqdn=testnode {"common_role1"=>{"key1"=>"value1", "key2"=>"value2"}, "production_role1"=>{"key1"=>"value1", "key2"=>"value2"}, "node_role1"=>{"key1"=>"value1", "key2"=>"value2"}}
      
      



この芁求は、前の芁求ず同様に、階局のすべおのレベルを通過し、すべおのハッシュを1぀の倧きな共通ハッシュに収集したす。 配列たたは文字列を収集しようずするず、゚ラヌが返されるず掚枬するのは簡単です。

 [root@testnode]# hiera --hash classes /usr/share/ruby/vendor_ruby/hiera/backend/yaml_backend.rb:42:in `block in lookup': Hiera type mismatch: expected Hash and got Array (Exception)
      
      



Pappetでは、このリク゚ストはhiera_hashず呌ばれたす。 同じ階局レベルで、同じハッシュに異なる「キヌ=>倀」のセットがある堎合はどうなりたすか たずえば、共通レベルのナヌザヌテストにはUID = 100があり、ノヌドレベルではtestnodeにUID = 200がありたすか この堎合、特定のキヌごずに、ハッシュルックアップは優先床ルックアップのように動䜜したす。぀たり、より高い優先床倀を返したす。 詳现に぀いおはこちらをご芧ください 。



さお、クヌル  たあ、そうで はない ですが、なぜこれがすべお必芁なのでしょうか

Pappetは自動的に バヌゞョン3.xではこのために䜕も蚭定する必芁さえありたせん圌が䜿甚できるパラメヌタヌをHieraでスキャンしたす。

そもそも、 Pappetのサむトから少し倉曎した単玔な䟋です ちなみに、この䟋では廃止されたntp :: autoupdateおよびntp :: enableパラメヌタヌを瀺しおいたす。珟圚の名前は以䞋にありたす。 長い間苊しんできたpuppetlabs-ntpモゞュヌルを苊しめたす。 Pappetで次のntp蚭定を衚珟したいずしたす

/etc/ntp.conf
いじくり回すパニック0

restrictデフォルトを制限するkod nomodify notrap nopeer noquery

restrict restrict -6デフォルトkod nomodify notrap nopeer noquery

制限する127.0.0.1

制限する-6 :: 1

サヌバヌ0.pool.ntp.org iburst burst

サヌバヌ1.pool.ntp.org iburst burst

サヌバヌ2.pool.ntp.org iburst burst

サヌバヌ3.pool.ntp.org iburst burst

driftfile / var / lib / ntp /ドリフト


これを行うには、Hierのcommon.yamlに次の行を远加したす。

 classes: - ntp ntp::restrict: - restrict default kod nomodify notrap nopeer noquery - restrict -6 default kod nomodify notrap nopeer noquery - restrict 127.0.0.1 - restrict -6 ::1 ntp::service_ensure: running ntp::service_enable: true ntp::servers: - 0.pool.ntp.org iburst burst - 1.pool.ntp.org iburst burst - 2.pool.ntp.org iburst burst - 3.pool.ntp.org iburst burst
      
      



クラスが呌び出されたずきにクラスに枡されるntpクラス倉数の特定の倀が、ここに単玔にリストされおいるこずが簡単にわかりたす。 これらの倉数は、ntpクラスのヘッダヌで宣蚀されおいたすファむルモゞュヌル/ ntp / manifests / init.pp。 Hieraからクラスにパラメヌタヌを枡すこの方法では、Pappetが目的のスコヌプ スコヌプに正しくロヌドするために、 完党修食倉数名を䜿甚するこずが絶察に必芁です。

あずは、環境のメむンPappetマニフェストsite.ppに1行远加するだけです。

 hiera_include('classes')
      
      



このラむンは、そのシンプルさず簡朔さにもかかわらず、舞台裏で倚くの䜜業を行いたす。 たず、PappetはHieraのすべおの階局を調べ、Hieraのクラスの すべおのセクションで宣蚀されおいるすべおのクラスを読み蟌みたす。 その埌、PappetはHieraのすべおの完党修食倉数を調べお、察応するクラスのスコヌプにロヌドしたす。 クラスリストからntpクラスを削陀しおも、YAMLファむルでこのクラスの倉数を削陀し忘れるず、Pappetは「宣蚀されたクラスntpを芋぀けるこずができたせん」などの゚ラヌをスロヌしたす。 ロヌドされたクラスがないず、その倉数はすべおの意味を倱いたす。

ここで、HieraのYAMLファむル内の単語クラス他のすべおの人ず同様には、特別な意味や予玄された意味はありたせん。 クラスの代わりに、production_classes、my_classes、my-{:: environment}などの他の単語を曞くこずができたす。 はい、埌者も同様です。Pappet 倉数はHieraセクションずハッシュキヌの名前でも䜿甚できたす。 文字列倉数や配列ず同様に、ハッシュ倀で倉数を䜿甚するこずはできたせん。時には残念です



したがっお、Hiera階局のPappetのマニフェストからntpサヌビスパラメヌタを効果的に削陀したした。 これで、蚘事の冒頭で説明した階局に埓っお、これらのntpパラメヌタヌがむンフラストラクチャ内のすべおのノヌドに完党に適甚されたす。 しかし、環境のより高いレベルたたは特定のサヌバヌのレベルでこれらのパラメヌタヌを再定矩する堎合は、必芁な階局のレベルで必芁な倉数の倀を指定するこずで簡単にこれを行うこずができたす。



実際、HieraからPappetにデヌタを自動的にむンポヌトするこの方法が唯䞀の方法ではありたせん。

非衚瀺のテキスト
画像






前の方法には1぀の重倧な欠点がありたす。それはあたりにも自動化されおいたす。 単玔な構成でその動䜜を簡単に予枬できる堎合、倚数のホストの堎合、むンポヌトされたクラスのリストに別のクラスを远加した結果を確実に䌝えるこずが垞に可胜ずは限りたせん。 たずえば、 puppetlabs-apacheモゞュヌルを䜿甚しお、特定のApache構成をいく぀かのノヌドに远加できたす。 無害なフレヌズを含める堎合

 classes: - apache
      
      



production.yamlファむルに远加するず、すべおの本番ホストでApacheのむンストヌル、蚭定、起動が行われたす。 さらに、apacheモゞュヌルは、 以前に蚭定されおいた以前の Apache 蚭定党䜓を消去したす。

非衚瀺のテキスト
画像






これがこのような楜しいデフォルトの動䜜です そのため、ドキュメントを読たなければ、単玔な「include apache」は高䟡になる堎合がありたす。



しかし、䜕をすべきか YAMLに必芁なノヌドだけにapacheを入力したすか どういうわけか、それは完党に䞭倮で取埗されおいたせん...

含めたいものず望たないものを遞択できるようにするために、Pappetはcreate_resources関数を䜜成したした。 そのアプリケヌションは、 ここで矎しく説明されおいたす 。

関数create_resourcesresource、hash1、hash2 リ゜ヌスリ゜ヌス Pappetを䜜成し、入力hash1およびhash2を枡したす。 Hash2はオプションですが、指定されおいる堎合、そのキヌず倀はhash1に远加されたす。 hash1ずhash2の䞡方に同じパラメヌタヌが指定されおいる堎合、hash1がより高い優先順䜍になりたす。 リ゜ヌスは、暙準のリスト Puppet型リファレンスを参照 から取埗するか、たたは私たちたたはクラスで事前に宣蚀 定矩された型 するこずができたす。 暙準リ゜ヌスの䟋はナヌザヌリ゜ヌスで、宣蚀されたリ゜ヌスの䟋はapacheモゞュヌルのapache :: vhostです。 Apacheの䟋を考えおみおくださいここでは、䞊蚘のリンクから良い䟋をコピヌしお貌り付けるこずができたす。



2぀のApache仮想ホストの次の構成をHieraに転送するずしたす。

 apache::vhost { 'foo.example.com': port => '80', docroot => '/var/www/foo.example.com', docroot_owner => 'foo', docroot_group => 'foo', options => ['Indexes','FollowSymLinks','MultiViews'], proxy_pass => [ { 'path' => '/a', 'url' => 'http://backend-a/' } ], } apache::vhost { 'bar.example.com': port => '80, docroot: => '/var/www/bar.example.com', }
      
      





Hieraでは、次のようになりたす。

 apache::vhosts: foo.example.com: port: 80 docroot: /var/www/foo.example.com docroot_owner: foo docroot_group: foo options: - Indexes - FollowSymLinks - MultiViews proxy_pass: - path: '/a' url: 'http://localhost:8080/a' bar.example.com: port: 80 docroot: /var/www/bar.example.com
      
      



Pappetマニフェストに曞かれおいるのは次のずおりです。

 $myvhosts = hiera('apache::vhosts', {}) create_resources('apache::vhost', $myvhosts)
      
      



ここの最初の行では、Apache :: vhostsセクションから構成党䜓をダりンロヌドするようHieraに䟝頌したした。 情報は、「foo.example.com」ず「bar.example.com」の2぀のハッシュの圢匏でロヌドされたした正確には、2぀の名前付きハッシュからなる名前のないハッシュが$ myvhosts倉数に分類されたした。 その埌、これらのハッシュはapache :: vhostsリ゜ヌスに順番に転送され、Pappetによっお䜜成されたす。



マニフェストからHieraにデヌタを転送する方法のもう1぀の良い䟋です。 ナヌザヌ管理。 Hieraで次のコヌドを蚘述する堎合
非衚瀺のテキスト
 users: user1: ensure: present home: /home/user1 shell: /bin/sh uid: 10001 managehome: true user2: ensure: present home: /home/user2 shell: /bin/sh uid: 10002 groups: - secondary_group1 - secondary_group2 user3: ensure: present home: /home/user3 shell: /bin/sh uid: 10003 groups: - secondary_group3 - secondary_group4
      
      





そしお、site.ppに次のように蚘述したす。

 $node_users = hiera_hash('users') create_resources(user, $users, {})
      
      



これにより、䞊蚘のすべおのナヌザヌが䜜成されたす。 hiera_hashを呌び出すず、usersセクションで宣蚀されたすべおのナヌザヌが階局党䜓から効率的に収集されるこずに泚意しおください。 競合がどこかで発生した堎合異なるファむルの異なるナヌザヌUID、Hieraは階局の䞊䜍レベルで説明されおいる倀を䜿甚したす。 論理的です。



たた、create_resourcesず定矩された型は、Pappetのルヌプの繰り返しを敎理する1぀の方法です。最初はこの関数がありたせん少なくずも将来のパヌサヌがなければ、ただ䜿甚するのは倢䞭ですか。 ここでは、䞡方の反埩方法に぀いお詳しく説明したす 。



それがすべおです。 Hieraの基本的な䜿い方を説明したした。 Pappet、hiera、hiera_array、hiera_hash、hiera_include、create_resourcesの暙準関数を䜿甚するず、おそらく既に掚枬したように、倚くのこずを思い぀くこずができたす。

次の蚘事では、PappetずHieraを䜿甚したサヌバヌロヌルの管理に぀いお説明したす。



All Articles