Puppet初心者向けチュートリアル:基本とDSL

⚡ スマートサマリー

Puppetは、サーバーのプロビジョニング、構成、および一貫性の維持を自動化するオープンソースの構成管理プラットフォームです。宣言型のドメイン固有言語を通じてインフラストラクチャをコードとして適用し、大規模なサーバー群における反復的な手動管理を置き換えます。

  • 🧩 構成管理: Puppetは、サーバー、ストレージ、ネットワークを既知の一貫した状態に保ち、すべての変更の監査可能な履歴を保持します。
  • 🏗️ マスターエージェント Archi構造: Linux マスターはカタログをコンパイルし、Linux 上のエージェントは、 Windows, Solarisまたは、Mac OS はセキュリティ保護された証明書の上にそれらを適用します。
  • 🔄 プルモデル: エージェントは1800秒ごとにチェックインし、必要なPuppetコードを取得し、ノード上の設定のずれを修正します。
  • 🧠 宣言型DSL: Rubyで書かれたPuppetは宣言型言語を使用しているため、段階的なコマンドではなく、望ましい最終状態を定義します。
  • 🧱 ビルディングブロック: リソース、クラス、マニフェスト、モジュールは再利用可能なコードを構造化し、デフォルトで49種類のコアリソースタイプが組み込まれています。
  • ⚙️ NTPの実践例: クラスを定義および宣言し、puppet parser validate で検証した後、puppet apply を使用してマニフェストを適用します。

Puppetのチュートリアルでは、構成管理の基本、マスターエージェントアーキテクチャ、宣言型DSLについて説明します。

Puppetは、インフラストラクチャをコードとして定義し、大規模なサーバー群を一貫性のある再現可能な状態に維持できるオープンソースの構成管理ツールです。Puppetを学ぶ前に、まずは構成管理について理解しておきましょう。

構成管理とは

構成管理とは、ソフトウェアやコンピュータシステム(サーバー、ストレージ、ネットワークなど)を、既知の、望ましい、一貫性のある状態に維持するプロセスです。また、プロジェクト管理や監査の目的で、システム状態の正確な履歴記録へのアクセスも提供します。

システム管理者は、サーバーのインストールや設定など、反復的な作業を主に行います。こうした専門家は、スクリプトを作成することで、これらの作業を自動化できます。

しかし、大規模なインフラストラクチャを扱う場合、これは困難な作業となる。こうした問題を解決するために、Puppetなどの構成管理ツールが導入された。

パペットとは何ですか?

人形 Puppetは、構成管理プロセスを一元化および自動化するためのシステム管理ツールです。また、ソフトウェア展開ツールとしても使用されます。

これはオープンソースの構成管理ソフトウェアであり、組織のインフラストラクチャ全体にわたるサーバーの構成、管理、展開、およびさまざまなアプリケーションやサービスのオーケストレーションに広く使用されています。

Puppet は、Linux の構成を管理するために特別に設計されており、 Windows システム。 Ruby で書かれており、独自の機能を使用しています。 Dオマイン S特異的な Lシステム構成を記述する言語 (DSL)。

パペットのバージョンは何ですか?

Puppet には XNUMX つのバージョンがあります。

  • オープンソースのパペットこれは、Puppet構成管理ツールの基本バージョンであり、オープンソース版Puppetとしても知られています。Puppetのウェブサイトから直接入手でき、Apache 2.0ライセンスの下で提供されています。
  • Puppet Enterpriseコンプライアンスレポート、オーケストレーション、ロールベースのアクセス制御、GUI、API、コマンドラインツールなど、ノードを効果的に管理するための機能を提供する商用版。

パペットって何ができるの?

例えば、約100台のサーバーで構成されるインフラストラクチャがあるとします。システム管理者として、これらのサーバーすべてが常に最新の状態に保たれ、完全な機能を発揮して稼働していることを確認するのがあなたの役割です。

システム管理者によるサーバーでの手動作業
システム管理者がサーバー上で手動で作業する

これを行うには、Puppet を使用できます。Puppet を使用すると、これらのサーバーに自動的にデプロイできるシンプルなコードを記述できます。これにより、人的労力が削減され、開発プロセスが迅速かつ効率的になります。

Puppet によるサーバー管理の自動化
Puppet はサーバー管理を自動化します

Puppet は次の機能を実行します。

  • Puppet を使用すると、ホストごとに個別の構成を定義できます。
  • このツールを使用すると、サーバーを継続的に監視して、必要な設定が存在し、変更されていないことを確認できます。設定が変更された場合、Puppet はホスト上で事前に定義された設定に戻します。
  • また、設定されているすべてのシステムを制御できるため、一元的に変更を加えると、自動的にすべてのシステムに反映されます。
  • また、ソフトウェアをシステムに自動的にデプロイするため、デプロイツールとしても使用されます。 インフラストラクチャはコードとして記述される。なぜなら、ポリシーと設定はコードとして記述されるからだ。

Puppet DSL とプログラミング パラダイム

Puppet DSLを学ぶ前に、プログラミングパラダイムについて理解しておきましょう。プログラミングパラダイムとは、コンピュータプログラミングにおいて用いるスタイルのことです。

パラダイムには次の XNUMX つのタイプがあります。

  • 命令。
  • 宣言的。
  • 機能型(宣言型パラダイムのサブセットとみなされる)。
  • オブジェクト指向。

命令型と宣言型のパラダイムに焦点を当てます。

命令的パラダイム

このプログラミングパラダイムは、計算の論理(何をすべきか)を表現すると同時に、その制御フロー(どのように行うか)も記述します。

例:

あなたがオフィスに向かうとしましょう。タクシーを予約し、オフィスに着くまで運転手に手順を一つずつ指示していきます。何をすべきか、どのようにすべきかを具体的に示すのは、命令型のコミュニケーションスタイルです。

宣言的パラダイム

このプログラミングパラダイムは、計算の論理(何をすべきか)を表現するものの、制御フロー(どのように行うか)については記述しません。

例:

あなたがオフィスに向かうとしましょう。Uberタクシーを予約し、最終目的地(オフィス)だけを指定します。何をするかは指定するが、どのようにするかは指定しないのは、宣言型スタイルです。

パラダイム 何をすべきか 実行する方法
命令 はい はい
宣言的 はい いいえ

Puppet は宣言型プログラミング パラダイムを使用します

Puppet は宣言型プログラミング アプローチを使用します。

例: システムにユーザーを作成します。

シェルスクリプトを使用した命令型プログラミングパターンで実行できます。ここでは、ユーザーの作成方法と、使用するコマンドを指定します。 オペレーティングシステム.

宣言的パラダイム

しかし、宣言型プログラミングパターンを用い、わずか数行のPuppetコードとPuppetドメイン固有言語(DSL)だけで、同じ結果を得ることも可能です。

宣言的パラダイム

構成管理ツールの導入モデル

には XNUMX つの導入モデルがあります 構成管理ツール:

  • プッシュベースの導入モデル: マスター ノードによって開始されます。
  • プルベースの展開モデル: エージェントによって開始されます。

プッシュベースの導入モデル

この展開モデルでは、マスターサーバーが構成とソフトウェアを個々のエージェントにプッシュします。安全な接続を確認した後、マスターはエージェント上でリモートでコマンドを実行します。たとえば、 Ansible そしてソルトスタック。

プル型デプロイメントモデル

このデプロイメントモデルでは、個々のサーバーがマスターサーバーに接続し、安全な接続を確認して確立し、構成とソフトウェアをダウンロードし、それに応じて自身を構成します。たとえば、Puppet と Chef.

パペットはどのように機能しますか?

Puppetはプルデプロイメントモデルに基づいており、エージェントノードは定期的にチェックインします。 1800 数秒後、マスターノードと通信して、エージェントで更新が必要な項目がないかを確認します。更新が必要な場合、エージェントはマスターから必要なPuppetコードを取得し、必要なアクションを実行します。

マスターエージェント構成の例を用いて説明しましょう。

マスター

これは、PuppetマスターソフトウェアがインストールされたLinuxベースのマシンです。Puppetコードの形式で構成を管理する役割を担います。マスターノードはLinuxのみに対応しています。

エージェントたち

これらはPuppetによって管理される対象マシンであり、Puppetエージェントソフトウェアがインストールされています。

エージェントは、Linux などのサポートされているオペレーティングシステム上で構成できます。 Windows, SolarisまたはMac OS。

マスターとエージェント間の通信は、安全な証明書を介して確立されます。

Puppet マスターエージェントの通信
Puppet マスターエージェントの通信

マスターとエージェント間の通信

ステップ1) エージェントとマスター間の接続が確立されると、Puppetエージェントは自身の状態に関するデータをPuppetマスターサーバーに送信します。これらのデータは「ファクト」と呼ばれ、ホスト名、カーネルの詳細、IPアドレス、ファイル名の詳細などが含まれます。

マスターとエージェント間の通信
エージェントがファクトをマスターに送信

ステップ2) Puppetマスターはこのデータを使用して、エージェントに適用する構成のリストを作成します。エージェントで実行されるこの構成のリストは、 カタログパッケージのインストール、アップグレードまたは削除、ファイルシステムの作成、ユーザーの作成または削除、サーバーの再起動、IP構成の変更などが含まれる可能性があります。

マスターとエージェント間の通信
マスターがエージェントにカタログを送信します

ステップ3) エージェントはこの構成リストを使用して、必要な構成変更をノードに適用します。

構成にずれがない場合、エージェントは構成変更を行わず、ノードを同じ構成で実行したままにします。

マスターとエージェント間の通信
エージェントは構成を適用します

ステップ4) 処理が完了すると、ノードはPuppetマスターに、設定が適用され完了したことを報告します。

パペットブロック

Puppetは、Puppet APIを使用してレポートをサードパーティツールと統合できる柔軟性を提供します。

人形の組み立てブロックには、以下の4種類があります。

  1. 資料
  2. クラス
  3. マニフェスト
  4. モジュール

パペットのリソース

Puppetのリソースは、Puppetの構成要素です。

リソースとは、 組み込み関数 これらはバックエンドで実行され、Puppetで必要な操作を実行します。

人形教室

異なるリソースを組み合わせて、クラスと呼ばれる単一の単位にまとめることができる。

パペットマニフェスト

マニフェストとは、Puppet DSLファイルを含むディレクトリのことです。これらのファイルは拡張子が.ppで、これはPuppetプログラムを意味します。Puppetコードは、Puppetクラスの定義または宣言で構成されます。

パペットモジュール

モジュールとは、マニフェストやクラス定義などのファイルやディレクトリの集合体です。これらはPuppetにおける再利用可能で共有可能な単位です。

例えば、 MySQL モジュールをインストールして設定します MySQL Jenkins モジュール管理 Jenkins.

パペットモジュール
パペットモジュール

Puppet リソースの種類

一般的に、システムはファイル、ユーザー、サービス、プロセス、パッケージなどで構成されます。Puppetでは、これらはリソースと呼ばれ、Puppetの基本的な構成要素です。

Puppetエージェントに対するすべての操作は、Puppetリソースの助けを借りて実行されます。

Puppetリソースは、サポートされているあらゆるプラットフォーム上で様々なタスクや操作を実行するために使用される既製のツールです。単一のPuppetリソースを使用して特定のタスクを実行することも、複数のPuppetリソースを組み合わせて複雑なアプリケーション構成のデプロイを実行することもできます。

リソースにはさまざまなタイプを含めることができます。 人形の使い方 リソース (NAIST) と リソースタイプ システムの構成を説明するため。

リソース タイプには次の XNUMX 種類があります。

  1. Puppet コアまたは組み込みリソース タイプ。
  2. Puppet で定義されたリソースタイプ。
  3. Puppet のカスタム リソース タイプ。

Puppet コアまたは組み込みリソース タイプ

コアリソースタイプまたは組み込みリソースタイプとは、Puppetソフトウェアに同梱されている、あらかじめ構築されたPuppetリソースタイプのことです。コアリソースタイプまたは組み込みリソースタイプはすべて、Puppetチームによって作成および保守されています。

Puppet で定義されたリソースタイプ

定義済みリソースタイプとは、既存のリソースタイプを組み合わせてPuppetの宣言型言語で記述された軽量なリソースタイプのことです。

Puppet のカスタム リソース タイプ

カスタム リソース タイプは、Ruby で記述された完全にカスタマイズされたリソース タイプです。

Puppetのリソースタイプについて、さらに詳しく見ていきましょう。

ターミナルで、以下のコマンドを入力して、Puppet関連のサブコマンドの一覧を表示します。

Puppet --help

Puppet のカスタム リソース タイプ

私たちの場合、サブコマンドに興味があります。リソースを追加する。これは、組み込みの Puppet リソース タイプに関する情報を見つけるために使用します。

ターミナルで、以下のコマンドのいずれかを入力して、 行動 Puppet サブコマンドに関連付けられています。リソースを追加する。"

Puppet help resource		
Puppet resource --help		

Puppet のカスタム リソース タイプ

この場合、 リソースを追加する。 サブコマンドとして、 -種類 アクションとして。

Puppet には 49 の組み込みコア リソース タイプがあります。

ターミナルで、以下のコマンドを入力して、利用可能な組み込みの Puppet リソースタイプの一覧を表示します。

puppet resource –types

Puppet のカスタム リソース タイプ

各タイプは次のリストをサポートします。 属性。 これらの属性は、Puppet がリソースを管理するために使用する詳細な説明を提供します。

Puppetリソースタイプに関連付けられているすべての属性を確認するには、次のコマンドを使用します。

puppet describe <resource type name>	

パラメータには、そのリソースタイプで使用可能なすべての属性が表示されます。

パペット記述パッケージ

Puppet のカスタム リソース タイプ

初心者にとって、管理されていない多数の Puppet コード ファイルを理解し、関連付けるのは難しい。ここでグループが必要になる。ping 複数の操作を連携させること。目的は、サーバー上でのSSH設定、NTPサービスの設定、あるいはWebサーバーやデータベースサーバーをゼロから構築するなど、必要なすべての操作をまとめて解決するといった、単一の問題を解決することです。

パペットクラスとは何ですか?

Puppetクラスは、Puppetリソースを単一の単位としてまとめたものです。

Puppet は、構造を再利用可能で整理できるようにするクラスを導入しました。

まず、クラス定義構文を使用してクラスを定義する必要があります。クラスは一意である必要があり、同じ名前で宣言できるのは一度だけです。

class <class-name> {
<Resource declarations>
}

例:

class ntpconfig {
    file {
        "/etc/ntp.conf": 
     ensure=> "present", content=> "server 0.centos.pool.ntp.org iburst\n",
    }
}

これまでのところ、クラスを定義しただけで、どこにも使用していません。つまり、このクラスを別の場所で宣言しない限り、私たちが書いたコードは決して実行されません。

クラス宣言

コード内で定義済みのクラスを使用するには、 include キーワード。

class ntpconfig {
    file {
        "/etc/ntp.conf": 
      ensure=> "present", 
      content=> "server 0.centos.pool.ntp.org iburst\n",
    }
}
include ntpconfig

現実世界のシナリオを通して、これを理解してみましょう。

NTP のデモインストール

まず、NTPパッケージがサーバーに既に存在しないことを確認してください。NTPパッケージがサーバーに存在しない場合、以下のコマンドは何も返しません。

rpm -qa | grep -i ntp

デモ NTP のインストール

ご覧のとおり、NTPパッケージは既にサーバー上に存在しています。既存のNTPパッケージを削除しましょう。

yum remove ntp

パッケージを削除した後、ntp.conf ファイルが存在しなくなっていることを確認してください。

ls -lrt /etc/ntp.conf

デモ NTP のインストール

以下のコマンドを実行して、ntpサービスが存在しないことを確認してください。

systemctl status ntp

デモ NTP のインストール

新しい .pp ファイルを作成してコードを保存します。 コマンドラインから:

vi demontp.pp

キーボードの「i」キーを押して挿入モードに切り替えます。

新しいファイルを作成するには、次のコードを入力します。

# Class Definition 
class ntpconfig {
    # Installing NTP Package 
  package {"ntp": 
    ensure=> "present",
    }
    # Configuring NTP configuration file 
  file {"/etc/ntp.conf": 
    ensure=> "present", 
    content=> "server 0.centos.pool.ntp.org iburst\n",
    }
    # Starting NTP services 
  service {"ntpd": 
    ensure=> "running",
    }
}

編集が終わったら、Escキーを押してください。

ファイルを保存するには、:wq! を押してください。

次のステップは、ある PowerSchoolで、緊急連絡先情報を定期的にチェックし、 コードに構文エラーがあるかどうかを確認します。次のコマンドを実行します。

puppet parser validate demontp.pp

切り替えたことを確認してください ルート ユーザーがエラーなくテストを完了できるようにするには、次のコマンドを実行してください。

su root

ホイール試乗 コード作成プロセスの次のステップです。スモーク テストを実行するには、次のコマンドを実行します。

Puppet applies demontp.pp --noop

最後のステップは ラン 実モードでパペットを実行し、出力結果を確認してください。

puppet apply demontp.pp

Puppet は何も実行しませんでした。デモ クラスは単に 定義済みの はなく、 宣言された.

つまり、Puppetクラスを宣言するまでは、コードは適用されません。

私たちにお知らせ 宣言する 同じコード内のデモクラスを使用して クラス名を含める コードの最後に:

# Class Definition 
class ntpconfig {
    # Installing NTP Package 
  package {"ntp": 
    ensure=> "present",
    }
    # Configuring NTP configuration file 
  file {"/etc/ntp.conf": 
    ensure=> "present", 
    content=> "server 0.centos.pool.ntp.org iburst\n",
    }
    # Starting NTP services 
  service {"ntpd": 
    ensure=> "running",
    }
}

# Class Declaration 
include ntpconfig

繰り返しになりますが、 PowerSchoolで、緊急連絡先情報を定期的にチェックし、 コードに構文エラーがあるかどうかを確認します。次のコマンドを実行します。

puppet parser validate demontp.pp

切り替えたことを確認してください ルート ユーザーがエラーなくテストを完了できるようにするには、次のコマンドを実行してください。

su root

テスト コード作成プロセスの次のステップです。スモーク テストを実行するには、次のコマンドを実行します。

Puppet apply demontp.pp --noop

最後のステップは ラン 実モードでパペットを実行し、出力結果を確認してください。

puppet apply demontp.pp

今回は、クラスが定義され、その後宣言されたため、コードが適用されます。

デモ NTP のインストール

ntp.confファイルが存在することを確認してください。

ls -lrt /etc/ntp.conf

以下のコマンドを実行して、ntpサービスが起動していることを確認してください。

systemctl status ntpd

デモ NTP のインストール

よくあるご質問

PuppetはRubyで記述されています。独自の宣言型ドメイン固有言語(DSL)を使用することで、管理者は各ステップをスクリプト化する代わりに、望ましいシステム状態を記述できます。PuppetのDSLはRubyに影響を受けていますが、マニフェストを作成するためにRubyの知識は必要ありません。

Puppetは宣言型のエージェントベースのプルモデルと独自のDSLを使用しているため、ノードはマスターからカタログを取得します。 Ansible エージェントレスで、SSH経由でYAMLプレイブックをプッシュします。Puppetは長期的な状態管理に適していますが、Ansibleは迅速なオンデマンドオーケストレーションに適しています。

デフォルトでは、Puppetマスター(Puppetサーバーとも呼ばれます)はTCPポート8140で待機します。PuppetエージェントはHTTPS経由でこのポートに接続し、ファクトを送信したり、コンパイル済みのカタログをダウンロードしたりします。エージェントとマスター間のファイアウォールでポート8140が開いていることを確認してください。

PuppetマスターはLinux上で実行する必要があります。PuppetエージェントはLinuxを含む多くのプラットフォームで実行されます。 Windows, Solarisおよび Mac OS。このクロスプラットフォームのエージェントサポートにより、単一の Puppet マスターが、混在するサーバーとワークステーションのフリートを中央管理できます。

Puppet Forge は、Puppet とコミュニティが共有する、事前に構築された Puppet モジュールの公開リポジトリです。マニフェストをゼロから記述する代わりに、次のようなソフトウェアをインストールおよび構成するモジュールをダウンロードできます。 MySQL or Jenkinsそして、それらをあなたの環境に合わせて調整してください。

はい。Puppetは、現在Perforceによってメンテナンスされている、広く利用されている構成管理およびインフラストラクチャ・アズ・コードツールです。Puppet 8が現在のメジャーリリースであり、オープンソース版Puppetと商用版の両方をサポートしています。 Puppet Enterprise 大規模なサーバー群の管理に。

AIアシスタントは、平易な言語のプロンプトからPuppet DSLを生成し、既存のマニフェストを説明し、puppet parser validateを実行する前に構文エラーや論理エラーを指摘することができます。 AI言語モデルを活用してコードのデバッグからデータの異常検出まで、 作成作業を迅速化することは重要ですが、生成されたリソースのパスと冪等性については必ず確認してください。

Yes. GitHubコパイロット 短いコメントまたはファイルコンテキストから、Puppetのマニフェスト、リソース宣言、およびクラス定義を自動補完します。 Rev生成されたコードは古いモジュールやデフォルト値を参照している可能性があるため、正しいリソースタイプ、属性名、および依存関係が出力されているか確認してください。