序章

エージェント/マスター構成でPuppetをセットアップした後、Puppetマニフェストとモジュールの作成についてサポートが必要になる場合があります。 Puppetを効果的に使用するには、マニフェストとモジュールがどのように構築されているかを理解する必要があります。 このチュートリアルでは、Puppetコードの基本について説明し、Puppetを使用してサーバー環境を管理するためのマニフェストとモジュールを作成する方法を示します。 Puppetを使用してUbuntu14.04VPSでLAMPスタックを構成する3つの異なる方法を示します。

前提条件

このチュートリアルを開始する前に、エージェント/マスターPuppetが機能している必要があります。 これをまだお持ちでない場合は、次のチュートリアルに従ってください:サーバーインフラストラクチャを管理するためにPuppetをインストールする方法

また、Puppetマスターが管理するPuppetエージェントノードとして機能するために、少なくとも1つの新しいVPSを作成できる必要があります。

新しいエージェントノードを作成する

「lamp-1」と呼ばれる新しいUbuntu14.04VPSを作成し、それをPuppetエージェントノードとして追加し、Puppetマスターでその証明書要求に署名します。

Puppetコードの基本

システムを構成するPuppetコードの記述に取り掛かる前に、一歩下がって、関連するPuppetの用語と概念のいくつかを確認しましょう。

資力

Puppetコードは、主にリソース宣言で構成されています。 リソースは、特定のユーザーやファイルが存在する必要がある、パッケージをインストールする必要があるなど、システムの状態に関する情報を記述します。 ユーザーリソース宣言の例を次に示します。

user { 'mitchell':
  ensure     => present,
  uid        => '1000',
  gid        => '1000',
  shell      => '/bin/bash',
  home       => '/home/mitchell'
}

リソース宣言は次のようにフォーマットされています。

resource_type { 'resource_name'
  attribute => value
  ...
}

したがって、前のリソース宣言は、指定された属性を持つ「mitchell」という名前のユーザーリソースを記述しています。

Puppetで使用可能なすべてのデフォルトのリソースタイプを一覧表示するには、次のコマンドを入力します。

puppet resource --types

このチュートリアルでは、さらにいくつかのリソースタイプについて説明します。

マニフェスト

人形劇はマニフェストと呼ばれます。 マニフェストはパペットコードで構成され、ファイル名は.pp拡張子を使用します。 aptを介してインストールされたPuppetのデフォルトのメインマニフェストは/etc/puppet/manifests/site.ppです。

前提条件のPuppetチュートリアルに従っている場合は、ファイルを作成してApacheをインストールするマニフェストを既に作成しています。 このチュートリアルでは、さらにいくつか書きます。

クラス

Puppetでは、クラスは他の場所のコードで呼び出すことができるコードブロックです。 クラスを使用すると、Puppetコードを再利用でき、マニフェストを読みやすくなります。

クラス定義

クラス定義は、クラスを構成するコードが存在する場所です。 クラスを定義すると、そのクラスをマニフェストで使用できるようになりますが、実際には何も評価されません。

クラスdefinitionのフォーマット方法は次のとおりです。

class example_class {
  ...
  code
  ...
}

上記は「example_class」という名前のクラスを定義しており、Puppetコードは中括弧の間にあります。

クラス宣言

クラス宣言は、マニフェストでクラスが呼び出されたときに発生します。 クラス宣言は、クラス内のコードを評価するようにPuppetに指示します。 クラス宣言には、通常とリソースのような2つの異なる種類があります。

通常のクラス宣言は、次のようにincludeキーワードがPuppetコードで使用されている場合に発生します。

include example_class

これにより、Puppetはexample_classのコードを評価します。

リソースのようなクラス宣言は、次のように、クラスがリソースのように宣言されたときに発生します。

class { 'example_class': }

リソースのようなクラス宣言を使用すると、クラスパラメータを指定できます。これにより、クラス属性のデフォルト値が上書きされます。 前提条件のチュートリアルに従った場合、PuppetLabsApacheモジュールを使用してhost2 にApacheをインストールしたときに、リソースのようなクラス宣言(「apache」クラス)をすでに使用しています。

node 'host2' {
  class { 'apache': }             # use apache module
  apache::vhost { 'example.com':  # define vhost resource
    port    => '80',
    docroot => '/var/www/html'
  }
}

リソース、マニフェスト、およびクラスについて理解したので、モジュールについて学習する必要があります。

モジュール

モジュールは、マニフェストとデータ(ファクト、ファイル、テンプレートなど)のコレクションであり、特定のディレクトリ構造を持っています。 モジュールを使用すると、コードを複数のマニフェストに分割できるため、Puppetコードを整理するのに役立ちます。 モジュールを使用して、ほぼすべてのPuppetマニフェストを整理することをお勧めします。

モジュールをPuppetに追加するには、モジュールを/etc/puppet/modulesディレクトリに配置します。

独自の基本モジュールを作成するために必要な詳細について説明します。 詳細については、 PuppetLabs ModuleFundamentalsリファレンスガイドをご覧ください。

マニフェストの開発

Puppetマニフェスト、クラス、およびモジュールを作成する方法を示すために、Puppetを使用してUbuntuでLAMPスタックをセットアップします(このチュートリアルのセットアップと同様)。 これまでにLAMPスタックを設定したことがない場合は、リンクされたチュートリアルを実行して、手動で設定する方法を理解しておくことをお勧めします。

LAMPスタックのチュートリアルから、次のリソースを備えたUbuntu14.04サーバーが必要であることがわかります。

  • Apacheパッケージ(apache2)がインストールされています
  • 実行中のApacheサービス(apache2)
  • MySQLサーバーパッケージ(mysql-server)がインストールされています
  • 実行中のMySQLサーバーサービス(mysql)
  • PHP5パッケージ(php5)がインストールされています
  • テストPHPスクリプトファイル(info.php)
  • パッケージをインストールする前にaptを更新する

次の3つのセクションでは、Puppetを使用して同様の結果を達成するさまざまな方法(動作するLAMPサーバー)を示します。 最初の例は、すべてが1つのファイルにある基本的なマニフェストを作成する方法を示しています。 2番目の例では、最初の例で開発したマニフェストに基づいて、クラスとモジュールを構築して使用する方法を示します。 最後に、3番目の例では、既存の公開されているモジュールを使用して、同様のLAMPスタックをすばやく簡単にセットアップする方法を示します。 3つの例すべてを学習する目的で試してみたい場合は、毎回新しいVPS(の前提条件で説明されている)から始めることをお勧めします。

例1:単一のマニフェストを使用してLAMPをインストールする

これまでにPuppetマニフェストを作成したことがない場合は、この例から始めることをお勧めします。 マニフェストはPuppetエージェントノードで開発され、puppet applyを介して実行されるため、エージェント/マスターのセットアップは必要ありません。

次のタイプのリソース宣言を使用するマニフェストを作成する方法を学習します。

  • exec apt-getなどのコマンドを実行します
  • package :apt経由でパッケージをインストールするには
  • service :サービスが実行されていることを確認します
  • file :特定のファイルが存在することを確認します

マニフェストを作成する

新しいlamp-1 VPSで、新しいマニフェストを作成します。

sudo vi /etc/puppet/manifests/lamp.pp

次の行を追加して、必要と判断したリソースを宣言します。 インラインコメントは、各リソース宣言の詳細を示しています。

# execute 'apt-get update'
exec { 'apt-update':                    # exec resource named 'apt-update'
  command => '/usr/bin/apt-get update'  # command this resource will run
}

# install apache2 package
package { 'apache2':
  require => Exec['apt-update'],        # require 'apt-update' before installing
  ensure => installed,
}

# ensure apache2 service is running
service { 'apache2':
  ensure => running,
}

# install mysql-server package
package { 'mysql-server':
  require => Exec['apt-update'],        # require 'apt-update' before installing
  ensure => installed,
}

# ensure mysql service is running
service { 'mysql':
  ensure => running,
}

# install php5 package
package { 'php5':
  require => Exec['apt-update'],        # require 'apt-update' before installing
  ensure => installed,
}

# ensure info.php file exists
file { '/var/www/html/info.php':
  ensure => file,
  content => '<?php  phpinfo(); ?>',    # phpinfo code
  require => Package['apache2'],        # require 'apache2' package before creating
} 

保存して終了。

マニフェストを適用する

次に、puppet applyコマンドを使用してマニフェストを実行します。 ランプ-1で、次を実行します。

sudo puppet apply --test

マニフェストのリソース宣言と一致するように、サーバーの状態がどのように変化しているかを示す出力の行が多数表示されます。 エラーがなかった場合は、パブリックIPアドレス(または、設定している場合はドメイン名)にアクセスして、ApacheとPHPが機能していることを示すPHP情報ページを参照できます。 MySQLがサーバーにインストールされていることを確認することもできます(セキュリティで保護されていませんが、今のところ心配する必要はありません)。 おめでとうございます! PuppetでLAMPスタックを設定します。

エージェント/マスターの設定を利用しなかったため、この特定の設定はそれほどエキサイティングではありません。 マニフェストは現在、他のエージェントノードでは利用できません。また、Puppetは、サーバーがマニフェストで説明されている状態にあることを継続的にチェックしていません(30分ごと)。

ここで、開発したマニフェストをモジュールに変換して、他のPuppetノードで使用できるようにします。

例2:新しいモジュールを作成してLAMPをインストールする

次に、例1で開発したLAMPマニフェストに基づいて、基本的なモジュールを作成しましょう。 今回は、Puppet masterノードでこれを行います。 モジュールを作成するには、Puppetのmodulesディレクトリにディレクトリ(名前がモジュール名と一致する)を作成する必要があります。このディレクトリにはmanifestsというディレクトリが含まれ、そのディレクトリにはinit.ppファイル。 init.ppファイルには、モジュール名と一致するPuppetクラスのみが含まれている必要があります。

モジュールの作成

Puppet master で、lampという名前のモジュールのディレクトリ構造を作成します。

cd /etc/puppet/modules
sudo mkdir -p lamp/manifests

次に、モジュールのinit.ppファイルを作成して編集します。

sudo vi lamp/manifests/init.pp

このファイル内に、次の行を追加して、「lamp」というクラスのブロックを追加します。

class lamp {

}

以前に作成したLAMPマニフェストの内容をコピーして(または上記の例1からコピーして)、lampクラスブロックに貼り付けます。 このファイルでは、「ランプ」クラスのクラス定義を作成しました。 クラス内のコードは現時点では評価されませんが、宣言することはできます。 さらに、モジュールを定義するためのPuppet規則に準拠しているため、このクラスは他のマニフェストからモジュールとしてアクセスできます。

保存して終了。

メインマニフェストでモジュールを使用する

基本的なランプモジュールが設定されたので、メインマニフェストを構成してlamp-1にLAMPスタックをインストールします。

Puppet master で、メインマニフェストを編集します。

sudo vi /etc/puppet/manifests/site.pp

ファイルが空であると仮定して、次の node ブロックを追加します(「lamp-1」を、LAMPをインストールするPuppetエージェントのホスト名に置き換えます)。

node default { }

node 'lamp-1' {

}

ノードブロックを使用すると、特定のエージェントノードにのみ適用されるPuppetコードを指定できます。 default ノードは、ノードブロックが指定されていないすべてのエージェントノードに適用されます。空のままにします。 lamp-1 ノードブロックは、 lamp-1Puppetエージェントノードに適用されます。

lamp-1 ノードブロックに、作成したばかりの「lamp」モジュールを使用するために次のコードを追加します。

  include lamp

保存して終了します。

次回lamp-1 Puppetエージェントノードがマスターから構成をプルするときに、メインマニフェストを評価し、LAMPスタックセットアップを指定するモジュールを適用します。 すぐに試してみたい場合は、lamp-1エージェントノードで次のコマンドを実行してください。

sudo puppet agent --test

完了すると、例1とまったく同じように、基本的なLAMPスタックがセットアップされていることがわかります。 ApacheとPHPが機能していることを確認するには、Webブラウザでlamp-1のパブリックIPアドレスにアクセスします。

http://lamp_1_public_IP/info.php

PHPインストールの情報ページが表示されます。

他のノードブロックで宣言することにより、作成した「ランプ」モジュールを再利用できることに注意してください。 モジュールの使用は、Puppetコードの再利用を促進するための最良の方法であり、コードを論理的に整理するのに役立ちます。

次に、既存のモジュールを使用して同様のセットアップを実現する方法を示します。

例3:既存のモジュールを使用してLAMPをインストールする

The Puppet Forge には、独自のインフラストラクチャを開発するときに役立つ、公開されているモジュールのリポジトリがあります。 Puppet Forgeモジュールは、組み込みのpuppet moduleコマンドを使用してすばやくインストールできます。 たまたま、ApacheとMySQLをインストールおよび保守するためのモジュールがここで利用可能です。 LAMPスタックのセットアップにどのように使用できるかを示します。

ApacheおよびMySQLモジュールをインストールします

Puppet master に、puppetlabs-apacheモジュールをインストールします。

sudo puppet module install puppetlabs-apache

次の出力が表示されます。これは、モジュールが正しくインストールされていることを示しています。

Notice: Preparing to install into /etc/puppetlabs/puppet/modules ...
Notice: Downloading from https://forgeapi.puppetlabs.com ...
Notice: Installing -- do not interrupt ...
/etc/puppet/modules
└─┬ puppetlabs-apache (v1.0.1)
  ├── puppetlabs-concat (v1.0.0) [/etc/puppet/modules]
  └── puppetlabs-stdlib (v3.2.0) [/etc/puppet/modules]

また、puppetlabs-mysqlモジュールをインストールします。

sudo puppet module install puppetlabs-mysql

これで、apacheおよびmysqlモジュールが使用可能になりました。

メインマニフェストを編集する

次に、メインマニフェストを編集して、新しいモジュールを使用してLAMPスタックをインストールします。

Puppet master で、メインマニフェストを編集します。

sudo vi /etc/puppet/manifests/site.pp

ファイルが空であると仮定して、次のノードブロックを追加します(例2に従った場合は、 lamp-1 ノードブロックの内容を削除するだけです)。

node default { }

node 'lamp-1' {

}

lamp-1 ノードブロック内で、リソースのようなクラス宣言を使用して apache モジュールを使用します(インラインコメントで各行を説明します)。

  class { 'apache':                # use the "apache" module
    default_vhost => false,        # don't use the default vhost
    default_mods => false,         # don't load default mods
    mpm_module => 'prefork',        # use the "prefork" mpm_module
  }
   include apache::mod::php        # include mod php
   apache::vhost { 'example.com':  # create a vhost called "example.com"
    port    => '80',               # use port 80
    docroot => '/var/www/html',     # set the docroot to the /var/www/html
  }

apache モジュールには、モジュールのデフォルトの動作をオーバーライドするパラメーターを渡すことができます。 モジュールが作成するデフォルトの仮想ホストを無効にするいくつかの基本設定を渡し、PHPを使用できる仮想ホストを作成するようにします。 PuppetLabs-Apacheモジュールの完全なドキュメントについては、そのreadmeを確認してください。

MySQLモジュールの使用は、Apacheモジュールの使用と似ています。 この時点では実際にはデータベースを使用していないため、単純にしておきます。 ノードブロック内に次の行を追加します。

  class { 'mysql::server':
    root_password => 'password',
  }

Apacheモジュールと同様に、MySQLモジュールは、パラメーターを渡すことで構成できます(完全なドキュメントはこちら

次に、info.phpが適切な場所にコピーされるようにするファイルリソースを追加しましょう。 今回は、 source パラメーターを使用して、コピーするファイルを指定します。 ノードブロック内に次の行を追加します。

  file { 'info.php':                                # file resource name
    path => '/var/www/html/info.php',               # destination path
    ensure => file,
    require => Class['apache'],                     # require apache class be used
    source => 'puppet:///modules/apache/info.php',  # specify location of file to be copied
  }

このファイルリソース宣言は、以前とは少し異なります。 主な違いは、contentパラメーターの代わりにsourceパラメーターを指定していることです。 Source は、ファイルの内容を単に指定するのではなく、ファイルをコピーするようにpuppetに指示します。 指定されたソースpuppet:///modules/apache/info.phpは、Puppetによって/etc/puppet/modules/apache/files/info.phpに解釈されるため、このリソース宣言が正しく機能するためには、ソースファイルを作成する必要があります。

site.ppを保存して終了します。

次のコマンドを使用して、info.phpファイルを作成します。

sudo sh -c 'echo "<?php  phpinfo(); ?>" > /etc/puppet/modules/apache/files/info.php'

次回lamp-1 Puppetエージェントノードがマスターから構成をプルするときに、メインマニフェストを評価し、LAMPスタックセットアップを指定するモジュールを適用します。 すぐに試してみたい場合は、lamp-1エージェントノードで次のコマンドを実行してください。

sudo puppet agent --test

完了すると、例1とまったく同じように、基本的なLAMPスタックがセットアップされていることがわかります。 ApacheとPHPが機能していることを確認するには、Webブラウザでlamp-1のパブリックIPアドレスにアクセスします。

http://lamp_1_public_IP/info.php

PHPインストールの情報ページが表示されます。

結論

おめでとう! Puppetを使用してUbuntu14.04LAMPスタックをセットアップしました。

Puppetコードの基本に精通し、基本的なマニフェストとモジュールを記述できるようになったので、Puppetを使用して環境の他の側面を構成してみてください。

まず、Puppetを使用してシステムユーザーとアプリケーション構成ファイルを管理することをお勧めします。 Puppetを使用してリソースを管理する場合は、Puppetマスターサーバー上の特定のリソースに変更を加える必要があります。そうしないと、次にエージェントノードが定期的なカタログプルリクエストを実行したときにリソースが上書きされます。

幸運を!