以前は、システム管理者はシェルスクリプトを使用してサーバーを実行していましたが、この方法ではスケーラビリティがゼロでした。絶えず変化する数百または数千のサーバーとそのシステム構成のスクリプトを絶えず変更することは、困難な作業です。
この記事では 人形モジュールとマニフェスト サーバーのセットアップ、プログラムのインストール、システム管理を自動化するためにpuppetモジュールを使用する方法を見てみましょう。
このブログでは、次のトピックについて説明します。
Puppetプログラミング入門
傀儡 は、構成管理に広く使用されている、広く使用されているDevOpsツールの1つです。それはもたらすために使用されます 一貫性 インフラストラクチャで。 Puppetは、インフラストラクチャをコードとして定義し、複数のサーバーを管理し、システム構成を実施できるため、インフラストラクチャ管理のプロセスを自動化するのに役立ちます。
人形は持っています独自の構成言語、 Puppet DSL
。他のDevOpsプログラムと同様に、Puppet 変更を自動化し、スクリプトによる手動の変更を排除します。ただし、Puppetは単なる別のシェル言語ではなく、PHPなどの純粋なプログラミング言語でもありません。代わりに、Puppetはに 宣言型モデルベースのアプローチ IT自動化へ。これにより、Puppetはインフラストラクチャをコードとして定義し、プログラムを使用してシステム構成を実施できます。
デモに取り掛かる前に、パペットプログラミングのいくつかのコアな側面を見てみましょう。
参照による呼び出しc ++
Puppetプログラミングの重要な用語
マニフェスト
人形劇と呼ばれる マニフェスト ファイル名は .pp 拡張。 Puppetのデフォルトのメインマニフェストは /etc/puppet/manifests/site.pp
。 (これは定義しますLDAP構成、DNSサーバー、またはすべてのノードに適用されるその他の構成などのグローバルシステム構成)。
クラス
これらのマニフェスト内には、 クラス 他のモジュールは呼び出すことができます。クラスは、アプリケーションの実行に必要なすべてのパッケージ、構成ファイル、サービスなど、機能の大規模または中規模のチャンクを構成します。クラスを使用すると、Puppetコードの再利用が容易になり、読みやすさが向上します。
リソース
Puppetコードは、主にリソース宣言で構成されています。 A 資源 システムの望ましい状態に関する特定の要素を記述します。たとえば、特定のファイルが存在する必要があることや、パッケージをインストールする必要があることを含めることができます。
Puppetモジュール
メインを除いてsite.pp
マニフェスト、マニフェストを保存しますに モジュール 。
すべてのPuppetコードは、再利用および共有できるPuppetの基本的な構成要素であるモジュールに編成されています。各モジュールは、ソフトウェアのインストールや構成など、インフラストラクチャ内の特定のタスクを管理します。
モジュールには、Puppetクラス、定義されたタイプ、タスク、タスクプラン、容量、リソースタイプ、およびプラグイン(カスタムタイプやファクトなど)が含まれます。 Puppetにモジュールをインストールしますモジュールパス。 Puppetは、module-path内のすべてのモジュールからすべてのコンテンツをロードし、このコードを使用できるようにします。
Puppetlabsには事前定義されたモジュールがあり、そこからダウンロードすることですぐに使用できます。 PuppetForge
。要件に合わせてカスタムパペットモジュールを作成することもできます。
人形劇のワークフロー
Puppetの宣言型言語を使用して、マニフェストと呼ばれるファイルでシステムの望ましい状態を記述します。マニフェストは、ネットワークと、ファイル、パッケージ、サービスなどのオペレーティングシステムリソースを構成する方法を説明します。
Puppetはマニフェストをにコンパイルします カタログ そして、各カタログを対応するノードに適用して、tの構成を確認します。ノードは正しいインフラストラクチャ全体。
デモンストレーション: ApacheとMySQLのインストールの自動化
puppetモジュールに関するこの記事は、puppetモジュールの2つの使用方法を示し、その方法も説明する実践的なものです。 自動化 これらの2つのモジュールで構成されたサーバーのインストール。
まず、Puppetマスターサーバーと2つのPuppetエージェントを含むPuppetインフラストラクチャがセットアップされていることを確認します。
- 操り人形マスター:Ubuntu 18.04
- エージェント1:Ubuntu 18.04
- エージェント2:CentOS7
このハンズオンで達成することの概要は次のとおりです。
それでは、実践から始めましょう。
モジュールを最初から作成する
このpuppetモジュールでは、Apacheパッケージのダウンロード、ファイルの構成、仮想ホストのセットアップなどのタスクを扱います。
- Puppet Masterから、Puppetのモジュールディレクトリに移動し、Apacheディレクトリを作成します。
cd / etc / puppet / modules sudo mkdir apache
- apacheディレクトリー内から、サブディレクトリー(マニフェスト、テンプレート、ファイル、および例)を作成します。
cd apache sudo mkdir {マニフェスト、テンプレート、ファイル、例}
- マニフェストディレクトリに移動します。
CDマニフェスト
- ここから、コードのそのセクションの目標に基づいて、モジュールをクラスに分割します。
init.pp -> Apacheパッケージをダウンロードするには
params.pp -> 変数とパラメータを定義する
config.pp -> Apacheサービスの構成ファイルを管理します。
vhosts.pp -> 仮想ホストを定義します。
このモジュールも利用します ヒエラ ((Puppetコードからデータを分離するために使用される組み込みのKey-Value構成データルックアップシステム)データ、 各ノードの変数を格納します。
ステップ1:Apacheパッケージをダウンロードする
init.ppクラスを作成します
今、私たちは作成しますinit.pp
apacheパッケージを保持するmanifestsディレクトリの下のファイル。
Apacheに異なるパッケージ名を使用する2つの異なるOS(ubuntuとCentOS7)があるため、変数を使用する必要があります$ apachename
。
/etc/puppetlabs/code/environments/production/modules/apache/manifests/init.pp
class apache {package {'apache':name => $ apachename、ensure => present、}}
パッケージ リソースはパッケージの管理を可能にします。これは、パッケージが存在することを追加、削除、または確認するために使用されます。
ほとんどの場合、 名前 リソースの(apache、上記)は、管理されているパッケージの名前である必要があります。命名規則が異なるため、パッケージの実際の名前を呼びますと一緒に 名前 参照。そう 名前 、まだ定義されていない変数を要求します$ apachename
。
確認する 参照により、パッケージが現在。
params.ppファイルを作成します
ザ・params.pp
ファイルは必要な変数を定義します。これらの変数を内で定義することはできますがinit.pp
ファイル、リソースタイプ自体の外部でより多くの変数を使用する必要があるため、params.pp
ファイルでは、変数をで定義できますもしステートメントであり、複数のクラスで使用されます。
作成するparams.pp
ファイルと次のコード。
/etc/puppetlabs/code/environments/production/modules/apache/manifests/params.pp
大学院は修士号です
class apache :: params {if $ :: osfamily == 'RedHat' {$ apachename = 'httpd'} elsif $ :: osfamily == 'Debian' {$ apachename = 'apache2'} else {fail( 'this is notサポートされているディストリビューション。 ')}}
オリジナルの外 init.pp
クラス、各クラス名はから分岐する必要がありますapache。このクラスを次のように呼びます apache :: params 。二重コロンの後の名前は、ファイルと名前を共有する必要があります。アンもしステートメントは、によって提供される情報から取得して、パラメーターを定義するために使用されます 因子 、Puppetには、インストール自体の一部としてファクトインストールがあります。ここで、Facterはオペレーティングシステムファミリをプルダウンします(osfamily)、それがそうであるかどうかを識別するためにRed Hat
またはDebianベース。
最終的に定義されたパラメータを使用して、を呼び出す必要があります params.pp
ファイルとパラメータをinit.pp
。これを行うには、クラス名の後、開始中括弧の前にパラメーターを追加する必要があります({)。
だからinit.pp
以前に作成したものは次のようになります。
class apache($ apachename = $ :: apache :: params :: apachename、)は:: apache :: params {パッケージ{'apache':name => $ apachename、ensure => present、}}を継承します
値の文字列 $ :: apache :: params :: value
Puppetに値をプルするように指示します apache モジュール、 パラメータ クラスの後にパラメータ名が続きます。フラグメント :: apache :: paramsを継承します
を可能にしますinit.pp
これらの値を継承します。
ステップ2:構成ファイルを管理する
Apache構成ファイルは、RedHatベースのシステムとDebianベースのシステムのどちらで作業しているかによって異なります。
このデモの最後に、次の依存関係ファイルがあります。httpd.conf
(レッドハット)、apache2.conf
(Debian)。
- の内容をコピーする
httpd.conf
そしてapache2.conf
別のファイルに保存し、 ファイル ディレクトリで/ etc / puppetlabs / code / environment / production / modules / apache / files
。
- 両方のファイルを編集して 無効にする 生き続ける。行を追加する必要があります キープアライブオフ の中に
httpd.conf
ファイル。この設定を変更したくない場合は、それぞれの上部にコメントを追加する必要がありますファイル:
/etc/puppetlabs/code/environments/production/modules/apache/files/httpd.conf
#このファイルはpuppetによって管理されています
これらのファイルをに追加しますinit.pp
したがって、Puppetは、マスターサーバーとエージェントノードの両方でこれらのファイルの場所を認識します。これを行うには、 ファイル 資源。
/etc/puppetlabs/code/environments/production/modules/apache/manifests/init.pp
file {'configuration-file':path => $ conffile、ensure => file、source => $ confsource、}
構成ファイルは2つの異なる場所にあるため、リソースに総称名を付けます 構成ファイル ファイルで 道 でパラメータとして定義されます道属性。
確認する それがファイルであることを確認します。
ソース 上で作成したファイルのPuppetマスター上の場所を提供します。
を開きますparams.pp
ファイル。
私たちは定義します $ conffile
そして $ confsource
内の変数もしステートメント:
/etc/puppetlabs/code/environments/production/modules/apache/manifests/params.pp
if $ :: osfamily == 'RedHat' {... $ conffile = '/ etc / httpd / conf / httpd.conf' $ confsource = 'puppet:///modules/apache/httpd.conf'} elsif $: :osfamily == 'Debian' {... $ conffile = '/ etc / apache2 / apache2.conf' $ confsource = 'puppet:///modules/apache/apache2.conf'} else {.. ..
パラメータを先頭に追加する必要がありますapacheのクラス宣言init.pp
前の例と同様のファイル。
設定ファイルが変更されたら、Apacheを再起動する必要があります。これを自動化するために、サービスリソースを使用できますと組み合わせて 通知する 属性。構成ファイルが変更されるたびに実行するリソースを呼び出します。
/etc/puppetlabs/code/environments/production/modules/apache/manifests/init.pp
file {'configuration-file':path => $ conffile、ensure => file、source => $ confsource、notify => Service ['apache-service']、} service {'apache-service':name => $ apachename、hasrestart => true、}
サービス リソースは、RedHatおよびDebianシステムでApache名を定義した作成済みのパラメーターを使用します。
hasrestart 属性は、定義されたサービスの再起動をトリガーするために使用されます。
ステップ3:仮想ホストファイルを作成する
システムのディストリビューションに応じて、仮想ホストのファイルは異なる方法で管理されます。このため、仮想ホストのコードをもしで使用されているものと同様のステートメントparams.pp
クラスですが、実際のPuppetリソースが含まれています。
- 内からapache /マニフェスト/ディレクトリを作成して開きます
vhosts.pp
ファイル。のスケルトンを追加しますもしステートメント:
/etc/puppetlabs/code/environments/production/modules/apache/manifests/vhosts.pp
class apache :: vhosts {if $ :: osfamily == 'RedHat' {} elsif $ :: osfamily == 'Debian' {} else {}}
CentOS7サーバー上の仮想ホストファイルの場所は次のとおりです。/etc/httpd/conf.d/vhost.conf
。
Puppetマスターでテンプレートとしてファイルを作成する必要があります。にあるUbuntu仮想ホストファイルについても同じようにします。/etc/apache2/sites-available/example.com.conf
、交換example.comサーバーのFQDNを使用します。
- に移動します テンプレート 内のファイル apache モジュールを作成してから、仮想ホスト用に2つのファイルを作成します。
Red Hatシステムの場合:
/etc/puppetlabs/code/environments/production/modules/apache/templates/vhosts-rh.conf.erb
ServerAdmin ServerName ServerAliaswww。 DocumentRoot / var / www // public_html / ErrorLog /var/www//logs/error.log CustomLog /var/www//logs/access.log
Debianシステムの場合:
/etc/puppet/modules/apache/templates/vhosts-deb.conf.erb
ServerAdmin ServerName ServerAliaswww。 DocumentRoot / var / www / html // public_html / ErrorLog /var/www/html//logs/error.log CustomLog /var/www/html//logs/access.logすべての付与が必要
これらのファイルでは、次の2つの変数のみを使用します。 adminemail
そして サーバー名
。これらは、ノードごとに、site.pp
ファイル。
- に戻る
vhosts.pp
ファイル。作成されたテンプレートは、コードで参照できるようになりました。
/etc/puppetlabs/code/environments/production/modules/apache/manifests/vhosts.pp
class apache :: vhosts {if $ :: osfamily == 'RedHat' {file {'/etc/httpd/conf.d/vhost.conf':ensure => file、content => template(' apache / vhosts-rh .conf.erb ')、}} elsif $ :: osfamily ==' Debian '{file {' /etc/apache2/sites-available/$servername.conf':ensure => file、content => template( 'apache /vhosts-deb.conf.erb ')、}} else {fail('これはサポートされているディストリビューションではありません。 ')}}
両方のディストリビューションファミリーがファイルリソースを取得し、それぞれのディストリビューションで仮想ホストの場所のタイトルを取得します。 Debianの場合、これはもう一度、$ servername
値。ザ・コンテンツ属性はそれぞれのテンプレートを呼び出します。
- 両方の仮想ホストファイルは2つのディレクトリを参照します。デフォルトでは、システムにはありません。これらを使用して作成できますファイルリソース、それぞれ内もしステートメント。完全な
vhosts.conf
ファイルは次のようになります。
/etc/puppetlabs/code/environments/production/modules/apache/manifests/vhosts.pp
class apache :: vhosts {if $ :: osfamily == 'RedHat' {file {'/etc/httpd/conf.d/vhost.conf':ensure => file、content => template(' apache / vhosts-rh .conf.erb ')、}ファイル{[' / var / www / $ servername '、' / var / www / $ servername / public_html '、' / var / www / $ servername / log '、]:ensure =>ディレクトリ、}} elsif $ :: osfamily == 'Debian' {file {'/etc/apache2/sites-available/$servername.conf':ensure => file、content => template(' apache / vhosts-deb。 conf.erb ')、} file {[' / var / www / $ servername '、' / var / www / $ servername / public_html '、' / var / www / $ servername / logs '、]:ensure =>ディレクトリ、}} else {fail( 'これはサポートされているディストリビューションではありません。')}}
ステップ4:モジュールをテストする
- に移動します
apache /マニフェスト/
ディレクトリ、実行します 人形パーサー すべてのファイルで、Puppetコーディングにエラーがないことを確認します。
sudo / opt / puppetlabs / bin / puppetパーサーvalidateinit.pp params.pp vhosts.pp
問題なく空に戻るはずです。
- に移動します 例 内のディレクトリapacheモジュール。作成する
init.pp
ファイルを作成し、作成したクラスを含めます。の値を置き換えます$ servername
そして$ adminemail
あなた自身で:
/etc/puppetlabs/code/environments/production/modules/apache/examples/init.pp
serveremail ='webmaster@example.com '$ servername =' puppet.example.com 'include apache include apache :: vhosts
- を実行してモジュールをテストします 人形が適用されます とともに –おっと 鬼ごっこ:
sudo / opt / puppetlabs / bin / puppet apply --noop init.pp
エラーを返さず、イベントからの更新をトリガーすることを出力する必要があります。 PuppetマスターにApacheをインストールして構成するには、–おっと、必要に応じて。
- メインのPuppetディレクトリに戻り、次にマニフェストフォルダ(ないApacheモジュールに存在するもの)。
cd / etc / puppetlabs / code / environment / production / manifests
作成するsite.pp
ファイル、各エージェントノードにApacheモジュールを含めます。の変数も入力しますadminemail
そして サーバー名
パラメーター。君のsite.pp
次のようになります。
/etc/puppetlabs/code/environments/production/manifests/site.pp
Javaでスキャナークラスを使用する
node'puppet-agent-ubuntu.example.com '{$ adminemail ='webmaster@example.com' $ servername = 'puppet.example.com' include apache include apache :: vhosts} node'puppet-agent-centos.example .com '{$ adminemail ='webmaster@example.com'$ servername =' puppet.example.com'include apache include apache :: vhosts}
デフォルトでは、管理対象ノードのPuppetエージェントサービスは、30分ごとにマスターに自動的に確認し、マスターから新しい構成を適用します。自動エージェント実行の合間に、Puppetエージェントプロセスを手動で呼び出すこともできます。エージェントノードで新しいモジュールを手動で実行するには、ノードにログインして次を実行します。
sudo / opt / puppetlabs / bin / puppet agent -t
モジュールを最初から作成する方法を学習したので、puppetlabsのパペットフォージから既存のモジュールを使用する方法を学習しましょう。
PuppetForgeのモジュールを使用する
パペットフォージ サーバーが実行するための多くのモジュールがすでにあります。これらは、作成したモジュールと同じように広範囲に構成でき、モジュールを最初から作成する必要がないため、時間を節約できます。
あなたがにいることを確認してください / etc / puppetlabs / code / environment / production / modules
ディレクトリをインストールし、 PuppetForgeのMySQLモジュール PuppetLabsによる。これにより、前提条件のモジュールもインストールされます。
cd / etc / puppetlabs / code / environment / production / modules
sudo / opt / puppetlabs / bin / puppet module install puppetlabs-mysql
Hieraを使用してデータベースを作成する
MySQLモジュールの構成ファイルを作成する前に、すべてのエージェントノードで同じ値を使用したくない場合があることを考慮してください。 Puppetにノードごとに正しいデータを提供するために、Hieraを使用します。ノードごとに異なるルートパスワードを使用するため、異なるMySQLデータベースが作成されます。
- 案内する
/ etc / puppet
Hieraの構成ファイルを作成しますhiera.yaml
概して傀儡ディレクトリ。 Hieraのデフォルト値を使用します。
/etc/puppetlabs/code/environments/production/hiera.yaml
---バージョン:5階層:-名前:共通パス:common.yamlデフォルト:data_hash:yaml_data datadir:data
- ファイルを作成する
common.yaml
。デフォルトを定義します ルート MySQLのパスワード:
/etc/puppetlabs/code/environments/production/common.yaml
mysql :: server :: root_password: 'パスワード'
私たちは使用しますcommon.yaml
ファイル変数が他の場所で定義されていない場合。これは、すべてのサーバーが同じMySQLrootパスワードを共有することを意味します。これらのパスワードは、セキュリティを強化するためにハッシュすることもできます。
- MySQLモジュールのデフォルトを使用するには、 「:: mysql :: server」を含める に行
site.pp
ファイル。ただし、この例では、モジュールのデフォルトの一部をオーバーライドして、ノードごとにデータベースを作成します。
編集するsite.pp
次の値のファイル:
node'Puppetagent-ubuntu.example.com '{$ adminemail ='webmaster@example.com' $ servername = 'hostname.example.com' include apache include apache :: vhosts include mysql :: server mysql :: db {'mydb_ $ {fqdn} ':user =>' myuser '、password =>' mypass '、dbname =>' mydb '、host => $ :: fqdn、grant => [' SELECT '、' UPDATE ']、tag = > $ domain、}} node'Puppetagent-centos.example.com '{$ adminemail ='webmaster@example.com' $ servername = 'hostname.example.com' include apache include apache :: vhosts include mysql :: server mysql :: db {'mydb _ $ {fqdn}':user => 'myuser'、password => 'mypass'、dbname => 'mydb'、host => $ :: fqdn、grant => ['SELECT'、 ' UPDATE ']、タグ=> $ domain、}}
puppetmasterからpuppetagentへのPuppetモジュールのインストールの自動化
- これらの更新は、各ノードにSSHで接続し、次のコマンドを発行することにより、各ノードで手動で実行できます。
sudo / opt / puppetlabs / bin / puppet agent -t
- それ以外の場合、管理対象ノードのPuppetエージェントサービスは、30分ごとにマスターに自動的に確認し、マスターから新しい構成を適用します。
カタログがUbuntuエージェントに正常に適用されました
CentOSエージェントにカタログが正常に適用されました
したがって、インストール全体が取得されます 自動化 カタログを適用するだけで、エージェントノードで。このデモで使用されるコードファイルと依存関係は次のとおりです。 ここに 。
このデモが、パペットモジュールとマニフェスト、およびITインフラストラクチャを自動化するためのそれらの使用法について明確に理解するのに役立つことを願っています。この場合、作業は非常に簡単になります。PuppetMasterで構成を指定するだけで、Puppetエージェントがメインマニフェストを自動的に評価し、ApacheとMySQLのセットアップを指定するモジュールを適用します。ご不明な点がございましたら、お気軽に投稿してください。 。
これを見つけたら Puppetチュートリアル 関連する、 チェックアウト 25万人以上の満足した学習者のネットワークを持つ信頼できるオンライン学習会社であるEdurekaが世界中に広がっています。 Edureka DevOps認定トレーニングコースは、学習者がSDLCの複数のステップを自動化するためのPuppet、Jenkins、Nagios、GITなどのさまざまなDevOpsプロセスとツールに関する専門知識を習得するのに役立ちます。