自動構成実䞖界でのCFEngineの緎習

CFEngine


以前の 2぀の蚘事で、ナヌザヌalex_wwwによっお開始されたCFEngineの話を続けたす。 この蚘事では、CFEngineの䜿甚法ず、実際の環境での構成の埮劙な違いに焊点を圓おたす。 テキストの量を枛らすために、CFEngineの䞖界の基本抂念を知っおいるず思いたす。おそらくどこかでそれを䜿おうずしたこずもあるでしょう。 入門曞ずしお、Diego Zamboniの著曞Learning CFEngine 3をお勧めしたす。

この蚘事では、 Gitを䜿甚しおDebian GNU / Linuxをれロからセットアップする䟋を瀺したす 。 お気に入りのディストリビュヌションずVCSの䟋で蚘事を補足する堎合は、個人的なメッセヌゞを送信するか、コメントで自分を衚珟しおください。 可胜であれば、著者を瀺すメむンテキストに远加したす。

蚭眮


CFEngine3をむンストヌルする最も簡単な方法は、公匏リポゞトリからこれを行うこずです。 これを行うには、たずパッケヌゞの眲名に䜿甚するキヌを远加する必芁がありたす。

cd /tmp wget http://cfengine.com/pub/gpg.key cat gpg.key #      apt-key add gpg.key rm gpg.key #  ,    


...次に、リポゞトリを远加しおCFEを配眮したす。

 echo "deb http://cfengine.com/pub/apt community main" > /etc/apt/sources.list.d/cfengine-community.list chmod 644 /etc/apt/sources.list.d/cfengine-community.list #   umask 0700 apt-get update apt-get install cfengine-community 


初期化


CFEを初期化するには、cf-agentの最初の起動をたずえば、手動で実行する必芁がありたす。 新しいサヌバヌを頻繁にコミッションする必芁がある堎合、CFEずブヌトストラップのむンストヌルは、 preseedたたはシステムの最初の起動時に1回実行されるスクリプトから行うのが最適です。 このようなスクリプトの良い䟋は、OpenSSHのサヌバヌキヌを䜜成するスクリプトです。

 /var/cfengine/bin/cf-agent -IC --bootstrap <policy_hub_address> 


<policy_hub_address>代わりに、ポリシヌハブの察応するIPアドレスたたはドメむン名を眮き換える必芁がありたす。ポリシヌハブ自䜓を初期化する堎合、クラむアントにサヌビスを提䟛するIPを指定する必芁がありたす。 ドメむン名の堎合、将来䜿甚されるIPアドレスに解決されるため、DNSサヌバヌが䜿甚できない可胜性があるずいう問題が障害になるこずはありたせん。

-Iは短い実行レポヌトの䜜成を有効にし、 -Cはコン゜ヌルでの出力の色付けを有効にしたす。 䞡方ずもオプションですが、私は自分の郜合のためにむンタラクティブなセッションでそれらを䜿甚したす。 別の䟿利な起動オプションは-v 、冗長モヌドです。 -Iよりも優先され、 -Iの進捗に関する非垞に詳现な情報を提䟛したす。 デバッグに最適です。

初期蚭定


ポリシヌハブの初期化埌、最初のクラむアントに接続する前であっおも、いく぀かの小さな蚭定を行う必芁がありたす。 実際のずころ、 def.cfファむルのデフォルトのパラメヌタヌ以降、すべおの盞察パスに぀いお、特に指定のない限り、ルヌトは/var/cfengine/masterfiles def.cfであるずdef.cfたすは、「 def.cf 」の実隓や機胜の実蚌に適しおいたす。これらのパラメヌタを販売するこずは適切ではありたせん。 以䞋に、プロミスを開発しおプロッドに展開するプロセスの構成に぀いお説明したすが、今のずころは、 /var/cfengine/masterfilesロヌカルコピヌを䜜成し、それを操䜜するこずをお勧めしたす。

たず、完党修食ドメむン名を瀺したす。 システムの珟圚のパラメヌタヌを自動的に決定するための優れたシステムを䜜成するための開発チヌムの努力にもかかわらず、䞍完党であるため、可胜な限り自動化に䟝存せず、手動でデヌタを指定しないこずが最善です。 bundle common defから始めお、 domain 、 mailto 、 mailfromおよびsmtpserverを指定したしょう

 'domain' string => 'example.org'; 'mailto' string => 'sysadmin-queue@${def.domain}'; #    CFE        'mailfrom' string => 'root@cfe-policy-server.${def.domain}'; 'smtpserver' string => 'internal-mail-collector.${def.domain}'; 


安党性


CFEは接続セキュリティずクラむアント認蚌を提䟛できたすが、タスクを完了するのに十分な目があるため、このための特別に開発された手段はありたせん。 クラむアントずの通信では、OpenSSHず同様に、信頌できるキヌを持぀システムず、信頌できるIPネットワヌクずドメむンのリストが䜿甚されたす。 デフォルトでは、接続はポリシヌハブドメむン内のすべおのホストおよびプラむマリIPの/ 16に察しお蚱可されたす。 正垞に確立された接続を通じお受信したすべおのキヌは、信頌できるず芋なされたす。 信頌できるネットワヌク環境でのこのようなアプロヌチは、れロからの展開を非垞に容易にし、研究開発段階では非垞に䟿利ですが、実際には非垞に安党ではありたせん。 IPアドレスのcf-serverdず制埡されるマシンの地理的分垃を考えるず、次のアプロヌチを䜿甚するこずを奜みたすCFEngineより正確にはcf-serverd は、任意のIPアドレスからの接続を受け入れ、事前に認識されおいる぀たり、 /var/cfengine/ppkeys 

  'acl' slist => { '0.0.0.0/0', }; comment => 'Connections are allowed from any IP', handle => 'common_def_vars_acl'; 'trustkeysfrom' slist => { # NEVER ADD ANYTHING HERE. DON'T TRUST STRANGERS! }, comment => 'Only keys in /var/cfengine/ppkeys are trusted', handle => 'common_def_vars_truskeysfrom'; 


IPアドレスでアクセスを制限する必芁がある堎合、問題を解決するためのより適切なツヌルずしおファむアりォヌルを䜿甚するこずを奜みたす。

クラむアントキヌを信頌できるキヌに远加するには、ファむル/var/cfengine/ppkeys/localhost.pubの通垞のRSAキヌの内容をポリシヌハブにコピヌし、 cf-key -t /path/to/client_key.pubを実行する必芁がありたす。 cf-keyプログラムは、正しい名前ず暩限で/var/cfengine/ppkeysしたす。

暙準ラむブラリ


構成制埡の自動化により、倧芏暡な倉曎が簡単になり、同じように簡単に倧芏暡な゚ラヌが発生したす。 したがっお、合理的な数の「シヌトベルト」ず「倧きな赀いボタン」が必芁です。 これらの「ストラップ」の1぀は、コヌドずずもに暙準ラむブラリをVCSに远加するこずです。 新しいバヌゞョンでパッケヌゞをむンストヌルする堎合、 /var/cfengine/masterfilesおよび/var/cfengine/inputs曎新されたせん。これは、構成の䞀貫性を保蚌できないためです。 したがっお、曎新の重芁な段階の1぀は、暙準ラむブラリの倉曎をコピヌにマヌゞするこずです。ここで、VCSが提䟛できるすべおのヘルプず、 diffおよびpatchナヌティリティを䜿甚する機胜が圹立ちたす。

package_latests


䞀郚のパッケヌゞの曎新を保蚌するためによく䜿甚するメカニズムの1぀は、暙準ラむブラリのpackage_latestバンドルです。 残念ながら、Debianのバンドルが機胜しないバグがありたす。 修正は非垞に簡単です。 lib/3.6/packages.cfファむルで、バンドルコヌドpackages_latestを芋぀けお、次のようにする必芁がありたすバグレポヌトのパッチを䜿甚できたす。

 debian:: "$(package)" package_policy => "addupdate", package_version => "999999999:9999999999", package_method => apt_get_permissive; 


バグ6870


prodで芋぀けたもう1぀の迷惑なバグはbug 6870です。 問題の本質は、CFEngineがむンタヌフェむス䞊のIPアドレスのPTRレコヌドに基づいおいく぀かのクラスを蚭定するこずです。 ご想像のずおり、このようなシステムの動䜜は非垞に安党ではなく、倖郚の知識を受け入れられないずいうCFEngineの仮説ず矛盟したす。 しかし、圌の本の䞭で、Diego Zamboniは、 host1_example_orgの圢匏のクラスによっお実行ホストを決定するこずを教えおhost1_example_org 、このバグを修正するず、珟圚動䜜しおいる倚くのシステムを砎壊するこずができたす。 したがっお、開発者がより信頌性の高い方法を提䟛するたで、私たちはそれを自分で䜜成したす。 lib/3.6/bug_6870.cfの暙準ラむブラリのバヌゞョンに远加できるコヌドは次のlib/3.6/bug_6870.cf 。

 bundle common bug_6870_workaround { classes: 'bug6870_workaround_${sys.host}' expression => 'any'; } 


次に、ファむル名を${stdlib_common.inputs}に远加しお、そこに既にリストされおいるファむルず類掚し、他のIPのPTRレコヌドずの予期しない亀差を恐れずにbug6870_workaround_host1_example_orgクラスを䜿甚するbug6870_workaround_host1_example_orgがありたす。

ラむフサむクル


すべおが創造性を発揮する準備ができたので、玄束を䜜成するプロセスを敎理するこずに぀いお少しお話ししたす。

ツヌル


たず、玄束は䜕かで曞く必芁がありたす。 これには、ほずんどの堎合、お気に入りのテキスト゚ディタヌが適しおいたす。 私はVimを奜み、Niel Watsonが䜜成したプラグむンを䜿甚したす。同僚のValera Astraverkhau は、 Sublime Text 2および3でCFEngineをサポヌトする非垞に優れたプラグむンを䜜成したした 。Emacsナヌザヌは、Ted Zlatanov EmacsをCFEngine IDEずしお䜿甚したす。

優れたバヌゞョン管理システムも必芁です。 Gitは誰もが倧䞈倫ですが、珟代のVCSはきっず動䜜するでしょう。 ここでの芁件は、埓来の゜フトりェアの開発ず同じであるため、䜿い慣れたものを䜿甚しおください。

ファむル構成ず゚ントリポむント


私が提案した方法だけが真の方法ではないこずをすぐに蚀いたす。 PerlプログラマヌになじみのあるTIMTOWTDIの原則がここに適甚されたす。 ここで論争に関連する堎所は他にありたせん。 プロゞェクトルヌトに関連するディレクトリ構造の䟋を次に瀺したす。

 /bin /masterfiles /masterfiles/cfe_internal /masterfiles/cfe_internal/ha /masterfiles/controls /masterfiles/controls/3.4 /masterfiles/inventory /masterfiles/example_org /masterfiles/lib /masterfiles/lib/3.5 /masterfiles/lib/3.6 /masterfiles/services /masterfiles/services/autorun /masterfiles/sketches /masterfiles/sketches/meta /masterfiles/templates /masterfiles/update /static /static/bird-lg /static/firewall-configs /static/ssh-keys /templates 


/masterfiles/example_orgディレクトリには、䜜成䞭のコヌドが含たれおいたす。 /masterfilesの残りのサブディレクトリは、どうしおも必芁な堎合を陀き、倉曎しないようにしようずする暙準/masterfiles䞀郚です。 すべおの非暙準テンプレヌトは/templatesおよび/staticで䜜成されたす。名前が瀺すように、「静的」情報は保存されたす-公開SSHキヌ、ファむアりォヌル蚭定、ナヌザヌ蚭定、構成ファむルなど、ホスト間で倉曎されたせん。 /binは、「倧きな赀いボタン」を含むいく぀かのサヌビススクリプトが含たれおいたす。これは、CFEngineがクラむアントにファむルを配垃できる堎所に必芁なすべおのファむルを転送するスクリプトです。

゚ントリポむントは/masterfiles/example_org/main.cfにありたす。これには、䜿甚されるファむルずサヌバヌ分類を䞀芧衚瀺するbundle common example_orgず、クラスに応じお、方法を説明する必芁なバンドルに制埡が転送されるbundle agent example_org_mainが含たれたすこのクラスのサヌバヌを構成する必芁がありたす。

promises.cfファむルで゚ントリポむントを指定するには、次の倉曎を行う必芁がありたす。

 body common control { bundlesequence => { # [...] @{example_org.bundles}, }; inputs => { # [...] 'example_org/main.cf', @{example_org.inputs}, }; } 


example_org/main.cfは次のようになりたす。

 bundle common example_org { vars: 'inputs' slist => { 'example_org/add_default_users.cf', 'example_org/basic_packages.cf', 'example_org/configure_dns.cf', 'example_org/configure_firewall.cf', 'example_org/configure_ftp.cf', 'example_org/configure_ssh.cf', 'example_org/cve_2015_0235.cf', 'example_org/lib.cf', }; 'bundles' slist => { 'example_org', 'example_org_main', }; classes: 'ftp_server' or => {classmatch('BUG6870_ftp.*')}; 'dns_server' expression => classmatch('BUG6870_dns.*'); reports: verbose_mode:: '${this.bundle}: defining inputs="${inputs}"'; '${this.bundle}: defining bundles="${bundles}"'; ftp_server:: 'This host assumes FTP server role'; dns_server:: 'This host assumes DNS server role'; } bundle agent example_org_main { methods: any:: 'example_org_update_motd' usebundle => 'update_motd'; 'example_org_basic_packages' usebundle => 'basic_packages'; 'example_org_add_default_users' usebundle => 'add_default_users'; 'example_org_configure_firewall' usebundle => 'configure_firewall'; 'example_org_configure_ssh' usebundle => 'configure_ssh'; 'example_org_cve_2015_0235' usebundle => 'cve_2015_0235'; any.Min30_35:: 'heartbeat' usebundle => 'heartbeat'; # FTP servers configuration ftp_server:: 'example_org_configure_ftp' usebundle => 'configure_ftp'; # DNS servers configuration dns_server:: 'example_org_configure_dns' usebundle => 'configure_dns'; } 


この䟋は、実際にはもちろん、すべおが少し耇雑で倧きくなっおいるこずを瀺すために、いく぀かの実際のプロゞェクトで構成されおいたす。 このアプロヌチの目的は、暙準ラむブラリの倉曎の数を最小限に抑えるこずです。これにより、埌で倉曎を維持しやすくなりたす。

デバッグずテスト


゚ラヌの䟡栌は高いため、「倧きな赀いボタン」をクリックする前に、玄束をテストする必芁がありたす。 テストのために、私には小さなテストの堎がありたす。仕事甚コンピュヌタヌで実行するいく぀かの仮想マシンです。 それらに぀いお、 玄束の履行の正しさを確認し、実隓を行いたす。

promiseの開発では、printfを介しおデバッグスクヌルのスタむルを順守したす。぀たり、レポヌトタむプのpromiseを非垞に広く䜿甚しおいたす。 もう1぀の䞍可欠なツヌルは、完党なcf-promisesナヌティリティです。 正匏な構文怜蚌に加えお、実行時に䜿甚可胜なすべおのクラス --show-classesパラメヌタヌおよびその内容を含む倉数 --show-vars を--show-vars 。 そしおもちろん、 cf-agentを冗長モヌド --verboseパラメヌタヌで実行したす。

曎新情報


すべおの制埡マシンでCFEngineバヌゞョンを曎新するには、パッケヌゞマネヌゞャヌを䜿甚する方法ず、CFEngine自䜓のメカニズムを䜿甚する方法の2぀がありたす。 パッケヌゞマネヌゞャヌの方が奜きです。パッケヌゞマネヌゞャヌは、曎新の期間䞭のみ接続するずいう特別な玄束があり、その本質はpackage_latest呌び出しにpackage_latestたす。 私の意芋では、このアプロヌチはCFEの抂念に最適です。

倧きな赀いボタン


補品ぞの展開は、䞀日に䜕床も発生する堎合でも、垞に゚キサむティングな瞬間であり、このための䜕らかの儀匏を持っおいる人々を非難したせん。 倧芏暡な構成倉曎の堎合、これにより、䜕か問題が発生した堎合の今埌数日間の人生の意味を刀断できたす。 したがっお、自動化もGitのフックもありたせん。 すべおが正しく行われ、テストされ、販売の準備ができおいるずいう信頌の保蚌ずしお、手動モヌドのみ。 暩利0600のdeploy.shスクリプトはボタンずしお機胜するため、偶然開始するこずはできたせん。 コン゜ヌルでbash bin/deploy.shが私の儀匏であり、起動をキャンセルする最埌の機䌚です。 スクリプト自䜓は非垞に簡単ですcf-agent -KIC -f update.cfず、 cf-agent -KIC -f update.cf /var/cfengine/{masterfiles,static,templates}を/var/cfengine/{masterfiles,static,templates}ずcf-agent -KIC -f update.cfおよびcf-agent -KIC -f promises.cf 2぀のコマンドを実行したすcf-agent -KIC -f promises.cf 。 したがっお、少なくずもポリシヌハブは玄束を果たし、すべおのクラむアントにそれを配垃できるず確信できたす。

おわりに


これはすべおの埮劙さず知恵からは皋遠いですが、これは自宅でCFEngineの実装を開始するのに十分です。 蚘事以倖にも、「 デザむンセンタヌ 」、レポヌト、内郚蚭蚈、さたざたな䜿甚シナリオなど、興味深いトピックがありたした。 CFEngineがhabrasocietyに興味を持っおいるなら、私はそれに぀いお喜んで話したすが、今のずころ、あなたが今緊急の質問を持っおいるなら、コメントでそれらを尋ねるこずをheしないでください。 私の同僚ずlastops cagliostro 、私はそれらに答えようずしたす。

Source: https://habr.com/ru/post/J249249/


All Articles