Puppetコード入門:マニフェストとモジュール

前書き

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

前提条件

このチュートリアルを開始する前に、動作するエージェント/マスターPuppetのセットアップが必要です。 これをまだ持っていない場合は、次のチュートリアルに従ってください:How To Install Puppet To Manage Your Server Infrastructure

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

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

「lamp-1」、add it as a Puppet agent nodeという新しいUbuntu 14.04 VPSを作成し、Puppetマスターでその証明書要求に署名します。

Puppetコードの基本

システムを構成するPuppetコードを作成する前に、関連するPuppetの用語と概念をいくつか確認してみましょう。

リソース

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

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

リソース宣言の形式は次のとおりです。

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

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

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

puppet resource --types

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

マニフェスト

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

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

クラス

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

クラス定義

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

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

class example_class {
  ...
  code
  ...
}

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

クラス宣言

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

normal class declarationは、次のように、includeキーワードがPuppetコードで使用されている場合に発生します。

include example_class

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

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

class { 'example_class': }

リソースのようなクラス宣言を使用すると、class parametersを指定できます。これは、クラス属性のデフォルト値をオーバーライドします。 前提条件のチュートリアルに従った場合、PuppetLabs Apacheモジュールを使用して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マニフェストを整理することをお勧めします。

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

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

マニフェストの開発

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

LAMPスタックのチュートリアルから、次のresourcesを持つUbuntu 14.04サーバーが必要であることがわかります。

  • インストールされたApacheパッケージ(apache2)

  • 実行中のApacheサービス(apache2)

  • MySQLサーバーパッケージ(mysql-server)がインストールされている

  • 実行中のMySQL Serverサービス(mysql)

  • PHP5パッケージ(php5)がインストールされている

  • テスト用のPHPスクリプトファイル(info.php)

  • パッケージをインストールする前にaptを更新する

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

例1:マニフェストが1つのLAMPをインストールする

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

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

  • execapt-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 => '',    # phpinfo code
  require => Package['apache2'],        # require 'apache2' package before creating
}

保存して終了。

マニフェストを適用

ここで、puppet applyコマンドを使用してマニフェストを実行する必要があります。 lamp-1で、これを実行します。

sudo puppet apply --test

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

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

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

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

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

モジュールを作成

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

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

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

sudo vi lamp/manifests/init.pp

このファイル内で、次の行を追加して、「ランプ」と呼ばれるクラスのブロックを追加します。

class lamp {

}

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

保存して終了。

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

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

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

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モジュールをインストールする

Puppetmasterに、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スタックをインストールします。

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

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モジュールはパラメーター(full documentation here)を渡すことで構成できます。

次に、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 "" > /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を使用して、Ubuntu 14.04 LAMPスタックをセットアップしました。

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

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

がんばろう!