序章

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が構成されていない場合は、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

を使用して1回限りの時刻同期を実行します ntpdate 指図:

  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マスターで証明書に署名することをお勧めします。 すべてが正しく機能することを確認したら、戻って残りのエージェントノードを自信を持って追加できます。

パペットマスターの証明書に署名する

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」であると判断できるため、 apache2 代わりにサービス httpd. これらは基本的な例ですが、ファクトをどのように使用できるかについてのアイデアを提供する必要があります。

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

  1. /opt/puppetlabs/bin/facter

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

Puppetはドメイン固有言語を使用してシステム構成を記述し、これらの記述は「マニフェスト」と呼ばれるファイルに保存されます。このファイルの拡張子は.ppです。 デフォルトのメインマニフェストファイルは、Puppetマスターサーバーにあります。 /etc/puppetlabs/code/environments/production/manifests/site.pp. 今のところ、プレースホルダーファイルを作成しましょう。

  1. sudo touch /etc/puppetlabs/code/environments/production/manifests/site.pp

現在、メインマニフェストは空であるため、Puppetはエージェントノードで構成を実行しないことに注意してください。

メインマニフェストの実行方法

Puppetエージェントは定期的に(通常は30分ごとに)Puppetサーバーにチェックインします。 チェックインすると、それ自体に関するファクトがマスターに送信され、現在のカタログ(メインマニフェストによって決定された、エージェントに関連するリソースとそれらの望ましい状態のコンパイル済みリスト)がプルされます。 次に、エージェントノードは、目的の状態を実現するために適切な変更を試みます。 このサイクルは、Puppetマスターが実行され、エージェントノードと通信している限り継続します。

特定のエージェントノードでの即時実行

(問題のエージェントノードで)次のコマンドを実行して、特定のエージェントノードのチェックを手動で開始することもできます。

  1. /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

このコマンドは、メインマニフェストが単一のサーバーにどのように影響するかをすぐに確認するのに役立ちます。

1回限りのマニフェスト

The puppet apply コマンドを使用すると、メインマニフェストに関連しないマニフェストをオンデマンドで実行できます。 applyを実行するノードにのみマニフェストを適用します。 次に例を示します。

  1. sudo /opt/puppetlabs/bin/puppet apply /path/to/your/manifest/init.pp

この方法でマニフェストを実行すると、エージェントノードで新しいマニフェストをテストする場合、またはマニフェストを1回だけ実行する場合に役立ちます(例: エージェントノードを目的の状態に初期化します)。

マニフェストの例

ご存知かもしれませんが、Puppetマスターのメインマニフェストファイルは次の場所にあります。 /etc/puppetlabs/code/environments/production/manifests/site.pp.

Puppetマスターサーバーで、今すぐ編集します。

  1. sudo vi /etc/puppetlabs/code/environments/production/manifests/site.pp

次に、ファイルリソースを説明する次の行を追加します。

site.ppの例
  1. file {'/tmp/example-ip': # resource type file and filename
  2. ensure => present, # make sure it exists
  3. mode => '0644', # file permissions
  4. content => "Here is my Public IP Address: ${ipaddress_eth0}.\n", # note the ipaddress_eth0 fact
  5. }

保存して終了します。 インラインコメントは、定義しているリソースを説明する必要があります。 平易な英語では、これにより、すべてのエージェントノードが次の場所にファイルを持つようになります。 /tmp/example-ip-rw-r--r-- ノードのパブリックIPアドレスを含むコンテンツを含む権限。

エージェントがマスターに自動的にチェックインするまで待つか、またはを実行することができます puppet agent --test コマンド(エージェントノードの1つから)。 次に、次のコマンドを実行してファイルを印刷します。

  1. cat /tmp/example-ip

次のような出力が表示されます(そのノードのIPアドレスを使用)。

Output:
Here is my Public IP Address: 128.131.192.11.

ノードを指定する

特定のノードのリソースを定義する場合は、 node マニフェストで。

マスターで編集 site.pp:

  1. sudo vi /etc/puppetlabs/code/environments/production/manifests/site.pp

次に、次の行を追加します。

site.ppの例
  1. node 'ns1', 'ns2' { # applies to ns1 and ns2 nodes
  2. file {'/tmp/dns': # resource type file and filename
  3. ensure => present, # make sure it exists
  4. mode => '0644',
  5. content => "Only DNS servers get this file.\n",
  6. }
  7. }
  8. node default {} # applies to nodes that aren't explicitly defined

保存して終了。

これで、Puppetは次のファイルを確認します。 /tmp/dns ns1およびns2に存在します。 あなたは実行したいかもしれません puppet agent --test スケジュールされたPuppetエージェントのプルを待ちたくない場合は、コマンド(ns1またはns2から)。

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

これらの例は何の役にも立ちませんが、Puppetが正しく機能していることを証明しています。

モジュールの使用

それでは、モジュールを使用してみましょう。 モジュールは、タスクをグループ化するのに役立ちます。 Puppetコミュニティには多くのモジュールがあり、独自のモジュールを作成することもできます。

Puppetマスターに、 puppetlabs-apache forgeapiのモジュール:

  1. sudo /opt/puppetlabs/bin/puppet module install puppetlabs-apache

警告:既存のApacheセットアップでこのモジュールを使用しないでください。 Puppetによって管理されていないApache構成をすべて削除します。

今編集 site.pp:

  1. sudo vi /etc/puppetlabs/code/environments/production/manifests/site.pp

次に、次の行を追加して、host2にApacheをインストールします。

site.ppの例
  1. node '<$>host2<$>' {
  2. class { 'apache': } # use apache module
  3. apache::vhost { 'example.com': # define vhost resource
  4. port => '80',
  5. docroot => '/var/www/html'
  6. }
  7. }
  8. # node default {} # uncomment this line if it doesn't already exist in your manifest

保存して終了。 次回Puppetがhost2を更新するときに、Apacheパッケージをインストールし、「 example.com 」という仮想ホストを構成し、ポート80でリッスンし、ドキュメントルートを使用します。 /var/www/html.

host2 で、次のコマンドを実行します。

  1. sudo /opt/puppetlabs/bin/puppet agent --test

Apacheがインストールされていることを示す一連の出力が表示されるはずです。 完了したら、Webブラウザでhost2のパブリックIPアドレスを開きます。 Apacheによって提供されているページが表示されます。

おめでとうございます! 最初のPuppetモジュールを使用しました!

結論

基本的なエージェント/マスターPuppetのインストールが完了したので、Puppetを使用してサーバーインフラストラクチャを管理する方法についてさらに学習する準備が整いました。 次のチュートリアルを確認してください: Puppetコード入門:マニフェストとモジュール