第4章 OpenStack Puppet モジュールへの設定追加
本章では、OpenStack Puppet モジュールに設定を追加する方法を考察します。これには、Puppet モジュール開発の基本指針も含まれます。
4.1. パペットの構文とモジュールの構造
次のセクションでは、Puppet の構文および Puppet のモジュールの構造を理解するのに役立つ基本事項を説明します。
4.1.1. Puppet モジュールの構造
OpenStack モジュールに貢献する前に、Puppet モジュールを作成するコンポーネントについて理解する必要があります。
- マニフェスト
マニフェストとは、リソースセットおよび属性を定義するコードが含まれるファイルのことです。リソースは、システムの設定可能なコンポーネントです。リソースの例には、パッケージ、サービス、ファイル、ユーザー、グループ、SELinux 設定、SSH キー認証、cron ジョブなどが挙げられます。マニフェストは、属性のキーと値のペアのセットを使用して必要な各リソースを定義します。
package { 'httpd': ensure => installed, }
たとえば、この宣言では、
httpd
パッケージがインストールされているかどうかを確認します。インストールされていない場合は、マニフェストがdnf
を実行してインストールします。マニフェストは、モジュールの manifest ディレクトリーに置かれています。また Puppet モジュールは、テストマニフェストのテストディレクトリーを使用します。これらのマニフェストを使用して、正式なマニフェストに含まれている特定のクラスをテストします。- クラス
- クラスは、マニフェスト内の複数のリソースを統合します。たとえば、HTTP サーバーをインストールして設定する場合には、HTTP サーバーパッケージをインストールするリソース、HTTP サーバーを設定するリソース、サーバーを起動または有効化するリソースの 3 つのリソースでクラスを作成します。また、他のモジュールからのクラスを参照して設定に適用することもできます。たとえば、Web サーバーも必要なアプリケーションを設定する必要がある場合に、上述した HTTP サーバーのクラスを参照することができます。
- 静的ファイル
モジュールには、システムの特定の場所に、Puppet がコピーできる静的ファイルが含まれます。マニフェストのファイルリソース宣言を使用して、場所やアクセス権限などのその他の属性を定義します。
静的ファイルは、モジュールの files ディレクトリーに配置されています。
- テンプレート
設定ファイルにはカスタムのコンテンツが必要な場合があります。このような場合にユーザーは静的ファイルの代わりにテンプレートを使用します。静的ファイルと同じように、テンプレートはマニフェストで定義され、システム上の場所にコピーされます。相違点は、テンプレートでは Ruby 表現でカスタマイズのコンテンツや変数入力を定義することができる点です。たとえば、カスタマイズ可能なポートで httpd を設定する場合には、設定ファイルのテンプレートには以下が含まれます。
Listen <%= @httpd_port %>
この場合の
httpd_port
変数はこのテンプレートを参照するマニフェストで定義されています。テンプレートは、モジュールの templates ディレクトリーに配置されています。
- プラグイン
Puppet のコア機能を超える要素については、プラグインを使用します。たとえば、プラグインを使用してカスタムファクト、カスタムリソース、または新機能を定義することができます。また、データベースの管理者が、PostgreSQL データベース向けのリソース種別を必要とする場合があります。プラグインを使用すると、データベース管理者は PostgreSQL のインストール後に新規データベースセットで PostgreSQL にデータを投入しやすくなります。その結果、データベース管理者は、PostgreSQL のインストールとその後のデータベース作成を確実に行う Puppet マニフェストのみを作成するだけで良くなります。
プラグインは、モジュールの lib ディレクトリーに配置されています。このディレクトリーには、プラグインの種別に応じたサブディレクトリーセットが含まれます。
-
/lib/facter
: カスタムファクトの場所 -
/lib/puppet/type
: 属性のキーと値のペアを記述するカスタムリソース種別の定義の場所 -
/lib/puppet/provider
: リソースを制御するためのリソース種別の定義と併用するカスタムリソースプロバイダーの場所 -
/lib/puppet/parser/functions
: カスタム関数の場所
-
4.1.2. サービスのインストール
一部のソフトウェアには、パッケージのインストールが必要です。これは、Puppet モジュールが実行可能な機能です。これには、特定のパッケージの設定を定義するリソース定義が必要です。
たとえば、mymodule
モジュールを使用して httpd
パッケージをインストールするには、mymodule
モジュールの Puppet マニフェストに以下のコンテンツを追加します。
class mymodule::httpd { package { 'httpd': ensure => installed, } }
このコードは、httpd
と呼ばれる mymodule
のサブクラスを定義します。続いて、httpd
パッケージのパッケージリソース宣言を定義します。ensure => installed
の属性は、パッケージがインストールされているかどうかを確認するように Puppet に指示を出します。インストールされていない場合には、Puppet は yum
を実行してパッケージをインストールします。
4.1.3. サービスの起動と有効化
パッケージのインストール後に、サービスを起動します。service
と呼ばれる別のリソース宣言を使用します。以下の内容が含まれるようにマニフェストを編集します。
class mymodule::httpd { package { 'httpd': ensure => installed, } service { 'httpd': ensure => running, enable => true, require => Package["httpd"], } }
結果:
-
ensure => running
属性は、サービスが実行さているかどうかを確認します。実行されていない場合は Puppet により有効化されます。 -
enable => true
属性は、システムの起動時にサービスが実行されるように設定します。 -
require => Package["httpd"]
属性は、リソース宣言同士の順序関係を定義します。今回の場合は、httpd
サービスがhttpd
パッケージのインストールの後に起動されるようにします。これにより、サービスと対応するパッケージの間で依存関係が作成されます。
4.1.4. サービスの設定
ポート 80 に Web ホストを設定するように、/etc/httpd/conf/httpd.conf
に HTTP サーバーのデフォルト設定が指定されています。ただし、ユーザー指定のポートに追加の Web ホストを提供するために、さらに設定を追加することができます。
手順
HTTP 設定ファイルを保存するには、テンプレートファイルを使用する必要があります。これは、ユーザー定義ポートに変数入力が必要なためです。モジュールの templates ディレクトリーに、以下の内容が含まれた
myserver.conf.erb
と呼ばれるファイルを追加します。Listen <%= @httpd_port %> NameVirtualHost *:<%= @httpd_port %> <VirtualHost *:<%= @httpd_port %>> DocumentRoot /var/www/myserver/ ServerName *:<%= @fqdn %>> <Directory "/var/www/myserver/"> Options All Indexes FollowSymLinks Order allow,deny Allow from all </Directory> </VirtualHost>
このテンプレートは、Apache Web サーバー設定の標準構文に従います。唯一の相違点は、モジュールから変数を注入する際に Ruby のエスケープ文字が含まれる点です。たとえば、Web サーバーポートを指定するのに使用する
httpd_port
などです。この中の
fqdn
は、システムの完全修飾ドメイン名を保存する変数です。これは、ステムファクト として知られています。システムファクトは、システムの各 Puppet カタログを生成する前に各システムから取得します。Puppet はfacter
コマンドを使用して、これらのシステムファクトを収集します。また、facter
を実行してこれらのファクトのリストを表示することもできます。-
myserver.conf.erb
を保存します。 モジュールの Puppet マニフェストにリソースを追加します。
class mymodule::httpd { package { 'httpd': ensure => installed, } service { 'httpd': ensure => running, enable => true, require => Package["httpd"], } file {'/etc/httpd/conf.d/myserver.conf': notify => Service["httpd"], ensure => file, require => Package["httpd"], content => template("mymodule/myserver.conf.erb"), } file { "/var/www/myserver": ensure => "directory", } }
結果:
-
サーバー設定ファイル (
/etc/httpd/conf.d/myserver.conf
) のファイルリソース宣言を追加します。このファイルのコンテンツは、作成したmyserver.conf.erb
テンプレートです。 -
このファイルを追加する前に、
httpd
パッケージがインストールされていることを確認します。 -
Web サーバー用のディレクトリー (
/var/www/myserver
) を作成する 2 番目のファイルリソース宣言を追加します。 -
notify => Service["httpd"]
属性を使用して、設定ファイルとhttpd
サービスの間の関係も追加します。これにより、設定ファイルへの変更の有無がチェックされます。ファイルが変更された場合には、Puppet によりサービスが再起動されます。