序章

Puppet LabsのPuppetは、システム管理者がサーバーインフラストラクチャのプロビジョニング、構成、および管理を自動化するのに役立つ構成管理ツールです。 事前に計画を立て、Puppetなどの構成管理ツールを使用すると、基本的なタスクの繰り返しに費やす時間を削減でき、インフラストラクチャ全体で構成の一貫性と正確性を確保できます。 Puppetやその他の自動化ツールを使用してサーバーを管理するコツをつかむと、セットアップの他の側面を改善するために使用できる空き時間が増えます。

Puppetには、PuppetEnterpriseとオープンソースのPuppetの2種類があります。 ほとんどのLinuxディストリビューション、さまざまなUNIXプラットフォーム、およびWindowsで動作します。

このチュートリアルでは、CentOS7のエージェント/マスターセットアップにオープンソースのPuppet4をインストールする方法について説明します。 このセットアップでは、 Puppetマスターサーバー(Puppetサーバーソフトウェアを実行)を使用して、他のすべてのサーバー、またはPuppetエージェントノードを制御できます。 Passengerやその他のランタイム環境の代わりに、PuppetServerパッケージを使用することに注意してください。

前提条件

このチュートリアルに従うには、Puppetを使用するすべてのサーバーへのrootまたはスーパーユーザーアクセス権が必要です。 Puppetマスターサーバーとして機能する新しいCentOS7サーバーを作成する必要もあります。 既存のサーバーインフラストラクチャがない場合は、前提条件のDNSセットアップチュートリアルに従って、サンプルインフラストラクチャ(以下で説明)を自由に再作成してください。

Puppetのインストールを開始する前に、次の前提条件があることを確認してください。

  • プライベートネットワークDNS:順方向および逆方向DNSを構成する必要があり、各サーバーには一意のホスト名が必要です。 これは、独自のプライベートネットワークDNSサーバーを構成するためのチュートリアルです。 DNSが構成されていない場合は、名前解決にhostsファイルを使用する必要があります。 インフラストラクチャ内の通信にプライベートネットワークを使用することを前提としています。
  • ファイアウォールオープンポート:Puppetマスターはポート8140で到達可能である必要があります。 ファイアウォールの制限が厳しすぎる場合は、この FirewallDチュートリアルで、ポート8140での着信リクエストを許可する方法を確認してください。

インフラストラクチャの例

次のインフラストラクチャを使用して、Puppetのセットアップ方法を示します。

ホスト名 役割 プライベートFQDN
host1 汎用CentOS7サーバー host1.nyc3.example.com
host2 汎用CentOS7サーバー host2.nyc3.example.com
ns1 プライマリネームサーバー ns1.nyc3.example.com
ns2 セカンダリネームサーバー ns2.nyc3.example.com

puppetエージェントはこれらすべてのホストにインストールされます。 これらのホストは、DNSの「.nyc3.example.com」サブドメインにマップされているプライベートネットワークインターフェイスによって参照されます。 これは、前提条件のチュートリアルで説明されているものと同じインフラストラクチャです: CentOS7でプライベートネットワークDNSサーバーとしてBINDを構成する方法。

すべての前提条件が整ったら、Puppetマスターサーバーの作成に進みましょう。

Puppetマスターサーバーを作成する

ホスト名として「puppet」を使用して、新しい CentOS 7x64サーバーを作成します。 ハードウェア要件は、管理するエージェントノードの数によって異なります。 2つのCPUコアと1GBのメモリは、少数のノードを管理するための最小要件ですが、サーバーインフラストラクチャが大きい場合は、より多くのリソースが必要になります。 Puppetサーバーは、デフォルトで2GBのRAMを使用するように構成されています。

ホスト名 役割 プライベートFQDN
傀儡 操り人形マスター puppet.nyc3.example.com

DNSを設定したばかりで、新しいホストを含める方法がわからない場合は、DNSチュートリアルのDNSレコードの保守セクションを参照してください。 基本的に、「A」および「PTR」レコードを追加し、新しいホストが再帰クエリを実行できるようにする必要があります。 また、サーバーが短いホスト名を使用して相互に検索できるように、検索ドメインを構成していることを確認してください。

注:このチュートリアルでは、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マスターサーバーはエージェントノードの認証局として機能するため、エージェント証明書を発行する際の潜在的な問題を回避するために、正確なシステム時間を維持する必要があります。時間の不一致があると、証明書の有効期限が切れているように見える場合があります。 この目的のためにネットワークタイムプロトコル(NTP)を使用します。

まず、次のコマンドで使用可能なタイムゾーンを確認します。

  1. timedatectl list-timezones

これにより、サーバーで使用可能なタイムゾーンのリストが表示されます。 サーバーに適した地域/タイムゾーンの設定が見つかったら、次のコマンドで設定します(希望の地域とタイムゾーンに置き換えます)。

  1. sudo timedatectl set-timezone America/New_York

次のコマンドを使用して、yum経由でNTPをインストールします。

  1. sudo yum -y install ntp

ntpdateコマンドを使用して、1回限りの時刻同期を実行します。

  1. sudo ntpdate pool.ntp.org

NTPサーバーに地理的に近い「プールゾーン」を使用するようにNTP構成を更新するのが一般的な方法です。 Webブラウザーで、 NTPプールプロジェクトに移動し、使用しているデータセンターに地理的に近いプールゾーンを検索します。 この例では、サーバーがニューヨークのデータセンターにあるため、米国のプール( http://www.pool.ntp.org/zone/us )を使用します。

ntp.confを開いて編集します。

  1. sudo vi /etc/ntp.conf

タイムサーバーを[NTPプールプロジェクト]ページからファイルの先頭に追加します(これらを選択したサーバーに置き換えます)。

/etc/ntp.confの抜粋
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を起動して、新しいタイムサーバーを追加します。

  1. sudo systemctl restart ntpd

最後に、NTPデーモンを有効にします。

  1. sudo systemctl enable ntpd

サーバーが正確な時刻を維持しているので、PuppetServerソフトウェアをインストールしましょう。

Puppetサーバーをインストールする

Puppet Serverは、Puppetマスターサーバーで実行されるソフトウェアです。 これは、Puppetエージェントソフトウェアを実行する他のサーバーに構成をプッシュするコンポーネントです。

次のコマンドを使用して、公式のPuppetLabsコレクションリポジトリを有効にします。

  1. sudo rpm -ivh https://yum.puppetlabs.com/puppetlabs-release-pc1-el-7.noarch.rpm

puppetserverパッケージをインストールします。

  1. sudo yum -y install puppetserver

これでPuppetServerがマスターサーバーにインストールされましたが、まだ実行されていません。

メモリ割り当ての構成(オプション)

デフォルトでは、Puppetサーバーは2GBのRAMを使用するように構成されています。 この設定は、マスターサーバーにある空きメモリの量と、マスターサーバーが管理するエージェントノードの数に基づいてカスタマイズする必要があります。

まず、お気に入りのテキストエディタで/etc/sysconfig/puppetserverを開きます。 viを使用します:

  1. sudo vi /etc/sysconfig/puppetserver

次に、JAVA_ARGS行を見つけ、-Xmsおよび-Xmxパラメーターを使用してメモリー割り当てを設定します。 たとえば、3 GBのメモリを使用する場合、行は次のようになります。

メモリ割り当て
JAVA_ARGS="-Xms3g -Xmx3g"

完了したら、保存して終了します。

Puppetサーバーを起動します

これで、次のコマンドを使用してPuppetServerを起動する準備が整いました。

  1. sudo systemctl start puppetserver

次に、Puppet Serverを有効にして、マスターサーバーの起動時に起動するようにします。

  1. sudo systemctl enable puppetserver

Puppet Serverは実行されていますが、まだエージェントノードを管理していません。 Puppetエージェントをインストールして追加する方法を学びましょう!

PuppetAgentをインストールする

Puppetエージェントソフトウェアは、Puppetマスターが管理するすべてのサーバーにインストールする必要があります。 ほとんどの場合、これにはインフラストラクチャ内のすべてのサーバーが含まれます。 はじめに述べたように、Puppetエージェントは、すべての主要なLinuxディストリビューション、一部のUNIXプラットフォーム、およびWindowsで実行できます。 インストールはOSごとにわずかに異なるため、CentOS7サーバーへのインストールについてのみ説明します。 Ubuntu 14.04サーバーにPuppetエージェントをインストールする手順は、ここにあります。

すべてのエージェントサーバーでこれらの手順を実行します。

次のコマンドを使用して、公式のPuppetLabsコレクションリポジトリを有効にします。

  1. sudo rpm -ivh https://yum.puppetlabs.com/puppetlabs-release-pc1-el-7.noarch.rpm

puppet-agentパッケージをインストールします。

  1. sudo yum -y install puppet-agent

Puppetエージェントがインストールされたので、次のコマンドで開始します。

sudo /opt/puppetlabs/bin/puppet resource service puppet ensure=running enable=true

Puppetエージェントを初めて実行すると、SSL証明書が生成され、署名要求がPuppetマスターに送信されます。 Puppetマスターがエージェントの証明書に署名すると、エージェントノードと通信して制御できるようになります。

すべてのPuppetエージェントノードに対してこのセクションを繰り返すことを忘れないでください。

注:これが初めてのPuppetエージェントである場合は、他のエージェントを追加する前に、次の手順で説明するPuppetマスターで証明書に署名することをお勧めします。 すべてが正しく機能することを確認したら、戻って残りのエージェントノードを自信を持って追加できます。

PuppetMasterの証明書に署名する

Puppetがエージェントノードで初めて実行されると、証明書署名要求がPuppetマスターに送信されます。 Puppet Serverがエージェントノードと通信して制御できるようになる前に、その特定のエージェントノードの証明書に署名する必要があります。 署名する方法と署名リクエストを確認する方法について説明します。

現在の証明書要求を一覧表示する

Puppetマスターで、次のコマンドを実行して、署名されていないすべての証明書要求を一覧表示します。

  1. 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の証明書に署名するには、次のコマンドを使用します。

  1. 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オプションを使用します。

  1. sudo /opt/puppetlabs/bin/puppet cert sign --all

証明書を取り消す

Puppetからホストを削除するか、ホストを再構築してからPuppetに追加し直すことができます。 この場合、Puppetマスターからホストの証明書を取り消す必要があります。 これを行うには、cleanアクションを使用できます。

  1. sudo /opt/puppetlabs/bin/puppet cert clean hostname

指定されたホストに関連付けられた証明書がPuppetから削除されます。

署名されたすべてのリクエストを表示

署名付きと署名なしのすべてのリクエストを表示する場合は、次のコマンドを実行します。

  1. sudo /opt/puppetlabs/bin/puppet cert list --all

すべてのリクエストのリストが表示されます。 署名されたリクエストの前には+があり、署名されていないリクエストには+がありません。

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アドレスを自動的に入力できます。 または、サーバーのディストリビューションが「CentOS」であると判断できるため、httpdではなくapache2サービスを実行する必要があります。 これらは基本的な例ですが、ファクトをどのように使用できるかについてのアイデアを提供する必要があります。

エージェントノードで自動的に収集されているファクトのリストを表示するには、次のコマンドを実行します。

  1. /opt/puppetlabs/bin/facter

メインマニフェストファイル

Puppetはドメイン固有言語を使用してシステム構成を記述し、これらの記述は「マニフェスト」と呼ばれるファイルに保存されます。このファイルの拡張子は.ppです。 デフォルトのメインマニフェストファイルは、Puppetマスターサーバー