前書き
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コードの開始:マニフェストとモジュール]。