前書き
Puppet LabsのPuppetは、システム管理者がサーバーインフラストラクチャのプロビジョニング、構成、および管理を自動化するのに役立つ構成管理ツールです。 事前に計画し、Puppetなどの構成管理ツールを使用すると、基本的なタスクの繰り返しに費やす時間を削減でき、インフラストラクチャ全体で構成の一貫性と正確性を確保できます。 Puppetおよびその他の自動化ツールを使用してサーバーを管理する方法を習得したら、セットアップのその他の側面を改善するために使用できる空き時間が増えます。
Puppetには、Puppet EnterpriseとオープンソースPuppetの2種類があります。 ほとんどのLinuxディストリビューション、さまざまなUNIXプラットフォーム、およびWindowsで実行されます。
このチュートリアルでは、Ubuntu 14.04のマスターエージェントセットアップでオープンソースPuppet 4をインストールする方法について説明します。 このセットアップでは、Puppet Serverソフトウェアを実行するPuppet masterサーバーを使用して、他のすべてのサーバーまたはPuppet agentノードを制御できます。 Passengerやその他のランタイム環境ではなく、Puppet Serverパッケージを使用することに注意してください。
前提条件
このチュートリアルを実行するには、Puppetを使用するすべてのサーバーへのルートまたはスーパーユーザーアクセスが必要です。 You will also be required to create a new Ubuntu 14.04 server to act as the Puppet master server。 既存のサーバーインフラストラクチャがない場合は、前提条件のDNSセットアップチュートリアルに従って、インフラストラクチャのサンプル(以下で説明)を自由に再作成してください。
Puppetのインストールを開始する前に、次の前提条件を満たしていることを確認してください。
-
Private Network DNS:順方向および逆方向DNSを構成する必要があり、各サーバーには一意のホスト名が必要です。 これがconfigure your own private network DNS serverのチュートリアルです。 DNSが構成されていない場合は、名前解決に
hosts
ファイルを使用する必要があります。 インフラストラクチャ内の通信にプライベートネットワークを使用すると想定します。 -
Firewall Open Ports:Puppetマスターはポート8140で到達可能である必要があります。 ファイアウォールの制限が厳しすぎる場合は、このUFW tutorialをチェックして、ポート8140での着信要求を許可する方法を確認してください。
インフラストラクチャの例
次のインフラストラクチャを使用して、Puppetのセットアップ方法を示します。
ホスト名 | Role | プライベートFQDN |
---|---|---|
host1 |
汎用Ubuntu14.04サーバー |
host1.nyc3.example.com |
host2 |
汎用Ubuntu14.04サーバー |
host2.nyc3.example.com |
ns1 |
プライマリネームサーバー |
ns1.nyc3.example.com |
ns2 |
セカンダリネームサーバー |
ns2.nyc3.example.com |
これらのすべてのホストにpuppetエージェントがインストールされます。 これらのホストは、プライベートネットワークインターフェイスによって参照され、DNSの「.nyc3.example.com」サブドメインにマップされます。 これは、前提条件のチュートリアルで説明されているものと同じインフラストラクチャです:How To Configure BIND as a Private Network DNS Server on Ubuntu 14.04。
すべての前提条件が揃ったら、Puppetマスターサーバーの作成に進みましょう!
Puppet Master Serverを作成する
ホスト名として「puppet」を使用して、新しいUbuntu 14.04x64サーバーを作成します。 ハードウェア要件は、管理するエージェントノードの数によって異なります。 2つのCPUコアと1GBのメモリは、少数のノードを管理するためのminimumの要件ですが、サーバーインフラストラクチャが大きい場合は、より多くのリソースが必要になります。 Puppet Serverはデフォルトで2GBのRAMを使用するように設定されています。
次の詳細を使用して、プライベートネットワークをDNSに追加します。
ホスト名 | Role | プライベートFQDN |
---|---|---|
人形 |
操り人形マスター |
puppet.nyc3.example.com |
DNSを設定したばかりで、新しいホストを含める方法がわからない場合は、DNSチュートリアルのMaintaining DNS Recordsセクションを参照してください。 基本的に、「A」および「PTR」レコードを追加し、新しいホストが再帰クエリを実行できるようにする必要があります。 また、サーバーが短いホスト名を使用して相互に検索できるように、検索ドメインを構成してください。
[。注意]##
Note:このチュートリアルでは、Puppetマスターのホスト名が「puppet」であると想定しています。 別の名前を使用する場合は、このチュートリアルから少し逸脱する必要があります。 具体的には、Puppetエージェントノードの構成ファイルでPuppetマスターのホスト名を指定する必要があり、エージェント証明書に署名する前にPuppetマスターのSSL証明書を再生成する必要があります。 それ以外の場合は、次のエラーが発生します:Error: Could not request certificate: The certificate retrieved from the master does not match the agent's private key.
。
この設定の構成については、このチュートリアルでは説明していません。
NTPをインストールする
エージェントノードの認証局として機能するため、Puppetマスターサーバーは、エージェント証明書を発行する際に潜在的な問題を回避するために正確なシステム時間を維持する必要があります。 この目的のためにNetwork Time Protocol(NTP)を使用します。
まず、次のコマンドで利用可能なタイムゾーンを確認します。
timedatectl list-timezones
これにより、サーバーで使用可能なタイムゾーンのリストが表示されます。 サーバーに適した地域/タイムゾーン設定が見つかったら、次のコマンドで設定します(お好みの地域とタイムゾーンに置き換えてください):
sudo timedatectl set-timezone America/New_York
次のコマンドを使用して、apt-get経由でNTPをインストールします。
sudo apt-get update
sudo apt-get -y install ntp
NTPサーバーに地理的に近い「プールゾーン」を使用するようにNTP構成を更新するのが一般的な方法です。 Webブラウザーで、NTP Pool Projectに移動し、使用しているデータセンターに地理的に近いpool zoneを検索します。 サーバーはニューヨークのデータセンターにあるため、この例では米国のプール(http://www.pool.ntp.org/zone/us)を使用します。
編集のためにntp.conf
を開きます。
sudo vi /etc/ntp.conf
NTP Pool Projectページからタイムサーバーをファイルの先頭に追加します(これらを選択したサーバーに置き換えます)。
/etc/ntp.conf excerpt
server 0.us.pool.ntp.org
server 1.us.pool.ntp.org
server 2.us.pool.ntp.org
server 3.us.pool.ntp.org
保存して終了。
NTPを起動して、新しいタイムサーバーを追加します。
sudo service ntp restart
サーバーが正確な時間を保持しているので、Puppet Serverソフトウェアをインストールしましょう。
Puppet Serverをインストールする
Puppet Serverは、Puppet masterサーバーで実行されるソフトウェアです。 Puppet agentソフトウェアを実行する他のサーバーに構成をプッシュするコンポーネントです。
次のコマンドを使用して、公式のPuppet Labsコレクションリポジトリを有効にします。
cd ~ && wget https://apt.puppetlabs.com/puppetlabs-release-pc1-trusty.deb
sudo dpkg -i puppetlabs-release-pc1-trusty.deb
sudo apt-get update
puppetserver
パッケージをインストールします。
sudo apt-get -y install puppetserver
これで、Puppet Serverがマスターサーバーにインストールされましたが、まだ実行されていません。
メモリ割り当てを構成する
デフォルトでは、Puppet Serverは2GBのRAMを使用するように構成されています。 この設定は、マスターサーバーの空きメモリ量と、管理するエージェントノードの数に基づいてカスタマイズする必要があります。
まず、お気に入りのテキストエディタで/etc/default/puppetserver
を開きます。 vi
を使用します:
sudo vi /etc/default/puppetserver
次に、JAVA_ARGS
行を見つけ、-Xms
および-Xmx
パラメータを使用してメモリ割り当てを設定します。 たとえば、3 GBのメモリを使用する場合、行は次のようになります。
メモリ割り当て
JAVA_ARGS="-Xms3g -Xmx3g"
完了したら保存して終了します。
Puppet Serverを起動します
これで、次のコマンドでPuppet Serverを起動する準備ができました。
sudo service puppetserver restart
次に、Puppet Serverを有効にして、マスターサーバーの起動時に起動するようにします。
sudo /opt/puppetlabs/bin/puppet resource service puppetserver ensure=running enable=true
Puppet Serverは実行されていますが、まだエージェントノードを管理していません。 Puppetエージェントをインストールして追加する方法を学びましょう!
Puppet Agentをインストールする
Puppet masterソフトウェアが管理するサーバーにPuppet agentソフトウェアをインストールする必要があります。 ほとんどの場合、これにはインフラストラクチャ内のすべてのサーバーが含まれます。 概要で説明したように、Puppetエージェントはすべての主要なLinuxディストリビューション、一部のUNIXプラットフォーム、およびWindowsで実行できます。 インストールはOSごとにわずかに異なるため、Ubuntu 14.04サーバーでのインストールのみを扱います。 CentOS 7サーバーにPuppetエージェントをインストールする手順は、hereにあります。
すべてのエージェントサーバーでこれらの手順を実行します。
次のコマンドを使用して、公式のPuppet Labsコレクションリポジトリを有効にします。
cd ~ && wget https://apt.puppetlabs.com/puppetlabs-release-pc1-trusty.deb
sudo dpkg -i puppetlabs-release-pc1-trusty.deb
次に、puppet-agent
パッケージをインストールします。
sudo apt-get update
sudo apt-get install puppet-agent
Puppetエージェントがインストールされたので、次のコマンドで起動します:
sudo /opt/puppetlabs/bin/puppet resource service puppet ensure=running enable=true
Puppetエージェントを初めて実行すると、SSL証明書が生成され、署名要求がPuppetマスターに送信されます。 Puppetマスターがエージェントの証明書に署名すると、エージェントノードと通信し、エージェントノードを制御できるようになります。
すべてのPuppetエージェントノードに対してこのセクションを繰り返すことを忘れないでください。
[.note]#Note:これが初めてのPuppetエージェントである場合は、他のエージェントを追加する前に、次の手順で説明するPuppetマスターで証明書に署名することをお勧めします。 すべてが正しく機能することを確認したら、戻って残りのエージェントノードを自信を持って追加できます。
#
Puppet Masterで証明書に署名する
エージェントノードで初めてPuppetを実行すると、証明書署名要求がPuppetマスターに送信されます。 Puppet Serverがエージェントノードと通信して制御できるようになる前に、特定のエージェントノードの証明書に署名する必要があります。 署名方法および署名リクエストの確認方法について説明します。
現在の証明書要求を一覧表示する
Puppetマスターで、次のコマンドを実行して、すべての未署名の証明書要求を一覧表示します。
sudo /opt/puppetlabs/bin/puppet cert list
最初のエージェントノードをセットアップしたばかりの場合、1つのリクエストが表示されます。 エージェントノードのホスト名を使用すると、次のようになります。
Output: "host1.nyc3.example.com" (SHA256) 15:90:C2:FB:ED:69:A4:F7:B1:87:0B:BF:F7:DD:B5:1C:33:F7:76:67:F3:F6:23:AE:07:4B:F6:E3:CC:04:11:4C
その前に+
がないことに注意してください。 これは、まだ署名されていないことを示しています。
リクエストに署名する
証明書要求に署名するには、署名する証明書のホスト名を指定して、puppet cert sign
コマンドを使用します。 たとえば、host1.nyc3.example.com
の証明書に署名するには、次のコマンドを使用します。
sudo /opt/puppetlabs/bin/puppet cert sign host1.nyc3.example.com
次の出力が表示されます。これは、証明書要求が署名されたことを示しています。
Output:Notice: Signed certificate request for host1.nyc3.example.com
Notice: Removing file Puppet::SSL::CertificateRequest host1.nyc3.example.com at '/etc/puppetlabs/puppet/ssl/ca/requests/host1.nyc3.example.com.pem'
Puppetマスターは、署名された証明書が属するノードと通信および制御できるようになりました。
現在のすべてのリクエストに署名する場合は、次のように--all
オプションを使用します。
sudo /opt/puppetlabs/bin/puppet cert sign --all
証明書を取り消す
Puppetからホストを削除するか、ホストを再構築してからPuppetに追加し直すことができます。 この場合、Puppetマスターからホストの証明書を失効させる必要があります。 これを行うには、clean
アクションを使用できます。
sudo /opt/puppetlabs/bin/puppet cert clean hostname
指定されたホストの関連証明書はPuppetから削除されます。
すべての署名済みリクエストを表示
署名付きおよび署名なしのすべてのリクエストを表示するには、次のコマンドを実行します。
sudo /opt/puppetlabs/bin/puppet cert list --all
すべてのリクエストのリストが表示されます。 署名された要求の前には` and unsigned requests do not have the `
が付きます。
Output:+ "puppet" (SHA256) 5A:71:E6:06:D8:0F:44:4D:70:F0:BE:51:72:15:97:68:D9:67:16:41:B0:38:9A:F2:B2:6C:BB:33:7E:0F:D4:53 (alt names: "DNS:puppet", "DNS:puppet.nyc3.example.com")
+ "host1.nyc3.example.com" (SHA256) F5:DC:68:24:63:E6:F1:9E:C5:FE:F5:1A:90:93:DF:19:F2:28:8B:D7:BD:D2:6A:83:07:BA:FE:24:11:24:54:6A
+ "host2.nyc3.example.com" (SHA256) CB:CB:CA:48:E0:DF:06:6A:7D:75:E6:CB:22:BE:35:5A:9A:B3:93:63:BF:F0:DB:F2:D8:E5:A6:27:10:71:78:DA
+ "ns2.nyc3.example.com" (SHA256) 58:47:79:8A:56:DD:06:39:52:1F:E3:A0:F0:16:ED:8D:40:17:40:76:C2:F0:4F:F3:0D:F9:B3:64:48:2E:F1:CF
おめでとうございます。 これで、Puppetでインフラストラクチャを管理する準備が整いました!
Puppetの使用開始
インフラストラクチャがPuppetで管理されるように設定されたので、Puppetを使用していくつかの基本的なタスクを実行する方法を示します。
事実の収集方法
Puppetは、facterというツールを使用して、各ノードに関する事実を収集します。 デフォルトでは、Facterはシステム構成に役立つ情報を収集します(例: OS名、ホスト名、IPアドレス、SSHキーなど)。 デフォルトのファクトセットの一部ではないカスタムファクトを追加することができます。
収集された事実は、多くの状況で役立ちます。 たとえば、Webサーバー構成テンプレートを作成し、特定の仮想ホストに適切なIPアドレスを自動的に入力できます。 または、サーバーのディストリビューションが「Ubuntu」であると判断できるため、httpd
ではなくapache2
サービスを実行する必要があります。 これらは基本的な例ですが、事実をどのように使用できるかについてのアイデアを提供する必要があります。
エージェントノードで自動的に収集されているファクトのリストを表示するには、次のコマンドを実行します。
/opt/puppetlabs/bin/facter
メインマニフェストファイル
Puppetはドメイン固有の言語を使用してシステム構成を記述し、これらの記述は「マニフェスト」と呼ばれるファイルに保存されます。このファイルの拡張子は.ppです。 デフォルトのメインマニフェストファイルは、on your Puppet master serverの/etc/puppetlabs/code/environments/production/manifests/site.pp
にあります。 プレースホルダーファイルを作成します。
sudo touch /etc/puppetlabs/code/environments/production/manifests/site.pp
現在、メインマニフェストは空なので、Puppetはエージェントノードで設定を実行しません。
メインマニフェストの実行方法
Puppetエージェントは定期的にPuppet Serverにチェックインします(通常は30分ごと)。 チェックインすると、それ自体に関する事実をマスターに送信し、現在のカタログ(リソースと、メインマニフェストによって決定されたエージェントに関連する望ましい状態のコンパイル済みリスト)を取得します。 次に、エージェントノードは適切な変更を加えて、目的の状態を達成しようとします。 このサイクルは、Puppetマスターが実行され、エージェントノードと通信している限り続きます。
特定のエージェントノードでの即時実行
次のコマンドを(問題のエージェントノードで)実行することにより、特定のエージェントノードのチェックを手動で開始することもできます。
/opt/puppetlabs/bin/puppet agent --test
これを実行すると、テストを実行しているエージェントにメインマニフェストが適用されます。 次のような出力が表示される場合があります。
Output:Info: Using configured environment 'production'
Info: Retrieving pluginfacts
Info: Retrieving plugin
...
Info: Loading facts
Info: Caching catalog for host1
Info: Applying configuration version '1457389302'
Notice: /Stage[main]/Main/File[/tmp/example-ip]/ensure: defined content as '{md5}dd769ec60ea7d4f7146036670c6ac99f'
Notice: Applied catalog in 0.04 seconds
このコマンドは、メインマニフェストが単一サーバーにどのように影響するかをすぐに確認するのに役立ちます。
一回限りのマニフェスト
puppet apply
コマンドを使用すると、メインマニフェストに関連しないマニフェストをオンデマンドで実行できます。 マニフェストは、applyを実行するノードにのみ適用されます。 これが一例です。
sudo /opt/puppetlabs/bin/puppet apply /path/to/your/manifest/init.pp
この方法でマニフェストを実行することは、エージェントノードで新しいマニフェストをテストする場合、またはマニフェストを1回だけ実行する場合に便利です(例: エージェントノードを目的の状態に初期化する)。
マニフェストの例
ご存知かもしれませんが、Puppetマスターのメインマニフェストファイルは/etc/puppetlabs/code/environments/production/manifests/site.pp
にあります。
Puppetマスターサーバーで、今すぐ編集します。
sudo vi /etc/puppetlabs/code/environments/production/manifests/site.pp
次に、ファイルリソースを説明する次の行を追加します。
site.pp example
file {'/tmp/example-ip': # resource type file and filename
ensure => present, # make sure it exists
mode => '0644', # file permissions
content => "Here is my Public IP Address: ${ipaddress_eth0}.\n", # note the ipaddress_eth0 fact
}
ここで保存して終了します。 インラインコメントは、定義しているリソースを説明するものでなければなりません。 平易な英語では、これにより、すべてのエージェントノードが-rw-r--r--
権限を持つ/tmp/example-ip
にファイルを持ち、そのコンテンツにはノードのパブリックIPアドレスが含まれます。
エージェントがマスターに自動的にチェックインするまで待つか、(エージェントノードの1つから)puppet agent --test
コマンドを実行することができます。 次に、次のコマンドを実行してファイルを印刷します。
cat /tmp/example-ip
次のような出力が表示されるはずです(そのノードのIPアドレスを使用)。
Output:Here is my Public IP Address: 128.131.192.11.
ノードを指定する
特定のノードのリソースを定義する場合は、マニフェストでnode
を定義します。
マスターで、site.pp
を編集します。
sudo vi /etc/puppetlabs/code/environments/production/manifests/site.pp
次の行を追加します。
site.pp example
node 'ns1', 'ns2' { # applies to ns1 and ns2 nodes
file {'/tmp/dns': # resource type file and filename
ensure => present, # make sure it exists
mode => '0644',
content => "Only DNS servers get this file.\n",
}
}
node default {} # applies to nodes that aren't explicitly defined
保存して終了。
これで、Puppetは、/tmp/dns
のファイルがns1とns2に存在することを確認します。 スケジュールされたPuppetエージェントのプルを待ちたくない場合は、(ns1またはns2から)puppet agent --test
コマンドを実行することをお勧めします。
リソースを定義しない場合、Puppetはリソースに触れないように最善を尽くします。 したがって、これらのリソースをマニフェストから削除しても、Puppetは作成したファイルを削除しません。 ファイルを削除する場合は、ensure
をabsent
に変更します。
これらの例は何の役にも立ちませんが、Puppetが適切に機能していることを証明しています。
モジュールを使用する
それでは、モジュールを使用しましょう。 モジュールは、タスクをグループ化するのに役立ちます。 Puppetコミュニティーには多くのモジュールが用意されており、独自のモジュールを作成することもできます。
Puppetマスターで、forgeapiからpuppetlabs-apache
モジュールをインストールします。
sudo /opt/puppetlabs/bin/puppet module install puppetlabs-apache
[.warning]#Warning:既存のApacheセットアップでこのモジュールを使用しないでください。 Puppetによって管理されていないApache構成を削除します。
#
次に、site.pp
を編集します。
sudo vi /etc/puppetlabs/code/environments/production/manifests/site.pp
次に、次の行を追加して、host2にApacheをインストールします。
site.pp example
node 'host2' {
class { 'apache': } # use apache module
apache::vhost { 'example.com': # define vhost resource
port => '80',
docroot => '/var/www/html'
}
}
# node default {} # uncomment this line if it doesn't already exist in your manifest
保存して終了。 次回Puppetがhost2を更新するときに、Apacheパッケージをインストールし、「example.com」と呼ばれる仮想ホストを構成し、ポート80でリッスンし、ドキュメントルート/var/www/html
を使用します。
host2で、次のコマンドを実行します。
sudo /opt/puppetlabs/bin/puppet agent --test
Apacheがインストールされていることを示す大量の出力が表示されます。 完了したら、ウェブブラウザでhost2のパブリックIPアドレスを開きます。 Apacheによって提供されているページが表示されます。
おめでとうございます。 最初のPuppetモジュールを使用しました!
結論
基本的なエージェント/マスターPuppetのインストールが完了したので、Puppetを使用してサーバーインフラストラクチャを管理する方法についてさらに学習する準備が整いました。 次のチュートリアルを確認してください:Getting Started With Puppet Code: Manifests and Modules。