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

前書き

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

前提条件

このチュートリアルを開始する前に、動作するエージェント/マスターPuppetのセットアップが必要です。 まだお持ちでない場合は、このチュートリアルに従ってください:https://www.digitalocean.com/community/tutorials/how-to-install-puppet-to-manage-your-server-infrastructure [管理するためにPuppetをインストールする方法]サーバーインフラストラクチャ]。

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

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

「lamp-1」という新しいUbuntu 14.04 VPSを作成します。https://www.digitalocean.com/community/tutorials/how-to-install-puppet-to-manage-your-server-infrastructure#InstallPuppetAgent [名前を付けて追加Puppet agentノード]、およびPuppet masterで証明書リクエストに署名します。

Puppetコードの基本

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

リソース

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

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つの異なるフレーバーがあります。

次のように、Puppetコードで `+ include +`キーワードを使用すると、*通常のクラス宣言*が発生します。

include example_class

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

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

class { 'example_class': }

リソースのようなクラス宣言を使用すると、クラス属性のデフォルト値をオーバーライドする_class parameters_を指定できます。 前提条件のチュートリアルに従っている場合、PuppetLabs Apacheモジュールを使用してApacheを_host2_にインストールしたときに、リソースのようなクラス宣言(「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 +`ディレクトリに配置します。

独自の基本モジュールを作成するために必要な詳細について説明します。 詳細については、https://docs.puppetlabs.com/puppet/latest/reference/modules_fundamentals.html [PuppetLabs Module Fundamentals]リファレンスガイドをご覧ください。

マニフェストの開発

Puppetマニフェスト、クラス、およびモジュールの記述方法を示すために、Puppetを使用してUbuntuでLAMPスタックをセットアップします(https://www.digitalocean.com/community/tutorials/how-to-installのセットアップと同様) -linux-apache-mysql-php-lamp-stack-on-ubuntu-14-04 [このチュートリアル])。 以前に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(リンク:[前提条件]で説明)から始めることをお勧めします。

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

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

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

  • * exec *: `+ apt-get`などのコマンドを実行します

  • パッケージ:aptを介してパッケージをインストールするには

  • * service *:サービスが実行されていることを確認するには

  • ファイル:特定のファイルが存在することを確認するため

マニフェストを作成する

新しい_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 +`コマンドを使用してマニフェストを実行します。 _lamp-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 /manifests

モジュールの `+ init.pp`ファイルを作成して編集します:

sudo vi lamp/manifests/init.pp

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

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-1 Puppetエージェントノードに適用されます。

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

 include lamp

ここで保存して終了します。

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

sudo puppet agent --test

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

http:///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_ノードブロック内で、リソースのようなクラス宣言を使用して_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モジュールの完全なドキュメントについては、https://forge.puppetlabs.com/puppetlabs/apache [readme]をご覧ください。

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

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

Apacheモジュールと同様に、MySQLモジュールはパラメーターを渡すことで構成できます(https://forge.puppetlabs.com/puppetlabs/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が機能していることを確認するには、ウェブブラウザーで_lamp-1_のパブリックIPアドレスにアクセスします。

http:///info.php

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

結論

おめでとうございます。 Puppetを使用して、Ubuntu 14.04 LAMPスタックをセットアップしました。

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

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

がんばろう!

前の投稿:DigitalOceanドロップレットでHadoopクラスターをスピンアップする方法
次の投稿:Ubuntu 18.04にNode.jsをインストールする方法