Ubuntu 14.04のマスターエージェントセットアップでPuppet 4をインストールする方法

前書き

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のファイルがns1ns2に存在することを確認します。 スケジュールされたPuppetエージェントのプルを待ちたくない場合は、(ns1またはns2から)puppet agent --testコマンドを実行することをお勧めします。

リソースを定義しない場合、Puppetはリソースに触れないように最善を尽くします。 したがって、これらのリソースをマニフェストから削除しても、Puppetは作成したファイルを削除しません。 ファイルを削除する場合は、ensureabsentに変更します。

これらの例は何の役にも立ちませんが、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