第4章 設定
本章では、OpenStack Puppet モジュールに設定を追加する方法を考察します。これには、Puppet モジュール開発の基本指針も含まれます。
4.1. Puppet の基礎知識
次のセクションでは、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 は dnf
を実行してパッケージをインストールします。
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. サービスの設定
上記の 2 つの手順では、Puppet を使用したサービスのインストールおよび有効化の方法を説明しました。しかし、サービスにカスタム設定を指定することもできます。本書の例では、ポート 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
を実行します。
このファイルを保存した後には、モジュールの 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
パッケージがインストールされていることも確認します。 -
2 番目のファイルリソース宣言も追加します。これにより、Web サーバーのディレクトリー (
/var/www/myserver
) が作成されます。 -
notify => Service["httpd"]
属性を使用して、設定ファイルと httpd サービスの間の関係も追加します。これにより、設定ファイルへの変更の有無がチェックされます。ファイルが変更された場合には、Puppet によりサービスが再起動されます。