前書き

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

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

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

前提条件

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

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

  • *プライベートネットワークDNS:*フォワードDNSとリバースDNSを設定する必要があり、各サーバーには一意のホスト名が必要です。 https://www.digitalocean.com/community/tutorials/how-to-configure-bind-as-a-private-network-dns-server-on-centos-7 [独自のプライベートネットワークを構成する]のチュートリアルをご覧ください。 DNSサーバー]。 DNSが設定されていない場合は、名前解決に `+ hosts +`ファイルを使用する必要があります。 インフラストラクチャ内の通信にプライベートネットワークを使用すると想定します。

  • * Firewall Open Ports:* Puppetマスターはポート8140で到達可能でなければなりません。 ファイアウォールの制限が厳しすぎる場合は、https://www.digitalocean.com/community/tutorials/how-to-set-up-a-firewall-using-firewalld-on-centos-7 [FirewallD Tutorial]をご覧ください。ポート8140で着信要求を許可する方法の手順。

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

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

Hostname Role Private FQDN

host1

Generic CentOS 7 server

host1.nyc3.example.com

host2

Generic CentOS 7 server

host2.nyc3.example.com

ns1

Primary nameserver

ns1.nyc3.example.com

ns2

Secondary nameserver

ns2.nyc3.example.com

これらのすべてのホストにpuppetエージェントがインストールされます。 これらのホストは、プライベートネットワークインターフェイスによって参照され、DNSの「.nyc3.example.com」サブドメインにマップされます。 これは、前提条件のチュートリアルで説明されているものと同じインフラストラクチャです:https://www.digitalocean.com/community/tutorials/how-to-configure-bind-as-a-private-network-dns-server-on-centos -7 [CentOS 7でBINDをプライベートネットワークDNSサーバーとして設定する方法]。

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

Puppet Master Serverを作成する

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

Hostname Role Private FQDN

puppet

Puppet master

puppet.nyc3.example.com

DNSを設定したばかりで、新しいホストを含​​める方法がわからない場合は、https://www.digitalocean.com/community/tutorials/how-to-configure-bind-as-a-private-network-dnsを参照してくださいDNSチュートリアルの-server-on-centos-7#maintaining-dns-records [DNSレコードの管理]セクション。 基本的に、「A」および「PTR」レコードを追加し、新しいホストが再帰クエリを実行できるようにする必要があります。 また、サーバーが短いホスト名を使用して相互に検索できるように、検索ドメインを構成してください。

NTPをインストールする

エージェントノードの認証局として機能するため、Puppetマスターサーバーは、エージェント証明書を発行する際に潜在的な問題を回避するために正確なシステム時間を維持する必要があります。 この目的のためにNetwork Time Protocol(NTP)を使用します。

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

timedatectl list-timezones

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

sudo timedatectl set-timezone

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

sudo yum -y install ntp

`+ ntpdate +`コマンドを使用して、1回限りの時間同期を行います。

sudo ntpdate pool.ntp.org

NTPサーバーに地理的に近い「プールゾーン」を使用するようにNTP構成を更新するのが一般的な方法です。 Webブラウザーで、http://www.pool.ntp.org/en/ [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の抜粋

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 systemctl restart ntpd

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

sudo systemctl enable ntpd

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

Puppet Serverをインストールする

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

次のコマンドで公式のPuppet Labsコレクションリポジトリを有効にします。

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

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

sudo yum -y install puppetserver

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

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

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

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

sudo vi /etc/sysconfig/puppetserver

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

メモリ割り当て

JAVA_ARGS="-Xms -Xmx"

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

Puppet Serverを起動します

これで、次のコマンドでPuppet Serverを起動する準備ができました。

sudo systemctl start puppetserver

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

sudo systemctl enable puppetserver

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

Puppet Agentをインストールする

Puppet masterソフトウェアが管理するサーバーにPuppet agentソフトウェアをインストールする必要があります。 ほとんどの場合、これにはインフラストラクチャ内のすべてのサーバーが含まれます。 概要で説明したように、Puppetエージェントはすべての主要なLinuxディストリビューション、一部のUNIXプラットフォーム、およびWindowsで実行できます。 インストールは各OSでわずかに異なるため、CentOS 7サーバーでのインストールのみを扱います。 Ubuntu 14.04サーバーにPuppetエージェントをインストールする手順は、https://www.digitalocean.com/community/tutorials/how-to-install-puppet-4-in-a-master-agent-setup-on-ubuntuにあります。 -14-04#install-puppet-agent [こちら]。

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

次のコマンドで公式のPuppet Labsコレクションリポジトリを有効にします。

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

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

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 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

次の出力が表示されます。これは、証明書要求が署名されたことを示しています。

Output:Notice: Signed certificate request for
Notice: Removing file Puppet::SSL::CertificateRequest  at '/etc/puppetlabs/puppet/ssl/ca/requests/.pem'

Puppetマスターは、署名された証明書が属するノードと通信および制御できるようになりました。

現在のすべてのリクエストに署名する場合は、次のように `+-all +`オプションを使用します。

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

証明書を取り消す

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

sudo /opt/puppetlabs/bin/puppet cert clean

指定されたホストの関連証明書はPuppetから削除されます。

すべての署名済みリクエストを表示

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

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 +」サービスを実行する必要があります。 これらは基本的な例ですが、事実をどのように使用できるかについてのアイデアを提供する必要があります。

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

/opt/puppetlabs/bin/facter

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

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

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

マニフェストの例

覚えているかもしれませんが、Puppetマスターのメインマニフェストファイルは `+ / etc / puppetlabs / code / environments / production / manifests / site.pp +`にあります。

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

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

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

site.ppの例

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
}

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

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

cat /tmp/example-ip

次のような出力が表示されるはずです(そのノードのIPアドレスを使用):

Output:Here is my Public IP Address: .

ノードを指定する

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

マスターで、 `+ site.pp +`を編集します:

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

次の行を追加します。

site.ppの例

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は_ns1_および_ns2_に `+ / tmp / dns `のファイルが存在することを保証します。 スケジュールされた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

次に、 `+ site.pp +`を編集します。

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

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

site.ppの例

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パッケージがインストールされ、ポート80でリッスンし、ドキュメントルート「+ / var / www / html +」で「example.com」という仮想ホストが設定されます。

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

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

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

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

結論

基本的なエージェント/マスターPuppetのインストールが完了したので、Puppetを使用してサーバーインフラストラクチャを管理する方法についてさらに学習する準備が整いました。 次のチュートリアルをご覧ください:https://www.digitalocean.com/community/tutorials/getting-started-with-puppet-code-manifests-and-modules[Puppetコードの開始:マニフェストとモジュール]。