Ubuntu 16.04にパペットマスターとクライアントをインストールする

**Puppet**は、自動化からアップデートインストールまで、様々なアプリケーションに対応したオープンソースの設定管理システムです。

*本ブログは英語版からの翻訳です。オリジナルは[こちら](https://www.alibabacloud.com/blog/how-to-install-puppet-master-and-client-on-ubuntu-16-04-_475202)からご確認いただけます。一部機械翻訳を使用しております。翻訳の間違いがありましたら、ご指摘いただけると幸いです。*

####序章
Puppetは、自動化からアップデートインストールまで幅広く利用できるオープンソースの設定管理システムです。Rubyで書かれており、UnixやWindowsのようなOSの設定を管理するために特別に設計されています。1台のサーバから数千台の物理サーバや仮想サーバを一元管理して簡単に導入・管理することができます。

Puppetは、クライアントサーバ型のアーキテクチャでもスタンドアロン型のアーキテクチャでも使用できます。クライアント・サーバ・アーキテクチャでは、サーバはマスターとして、クライアントはエージェントとして知られています。Puppetには、EnterpriseとOpen sourceの2つのバージョンがあります。どちらも多くのLinuxディストリビューションとWindowsをサポートしています。Puppetは、システム管理者が反復的な作業に費やす時間を削減し、より大きなビジネス価値を提供するプロジェクトに集中できるようにすることで、システム管理者を支援します。

####特徴
- PuppetはIdempotencyをサポートしており、同じマシン上で同じ設定を複数回実行することが容易になります。
- 同じ問題を解決している全員のタスクを重複して実行する必要がなくなります。
- すべてのタスクはネイティブコードで書かれており、簡単に共有することができます。
- 繰り返し可能な変更を自動的に行うことができます。
- 必要に応じて拡張機能を追加することで、余分な機能を追加することができます。

このガイドでは、オープンソースのPuppetをUbuntu 16.04サーバ上で、Alibaba Cloud Elastic Compute Service (ECS)インスタンスを使用してクライアント/サーバアーキテクチャでインストールし、設定する手順を説明します。

####前提条件
- Ubuntu 16.04がインストールされたパペットマスター用のAlibaba Cloud ECSインスタンス。
- Ubuntu 16.04がインストールされたPuppetエージェント用のAlibaba Cloud ECSインスタンス。
- パペットマスターに静的IPアドレス192.168.0.103が設定されている。
- パペットエージェントに192.168.0.104の静的IPアドレスが設定されている。
- パペットマスターには最低4GBのメモリとデュアルコアCPUが必要。
- 両方のインスタンスにsudo権限を持つ非rootユーザが設定されている。

####ホスト名の設定
始める前に、Server ノードと agent ノードで /etc/hosts と /etc/hostname ファイルを設定して、これらのファイルが相互に通信できるようにする必要があります。

Serverノードで/etc/hostsと/etc/hostnameファイルを開き、以下の変更を行います。

`sudo nano /etc/hosts`

ファイルの最後に以下の行を追加します。

`192.168.0.0.103 puppet-server`

`sudo nano /etc/hostname`

以下のようにファイルを変更します。

`puppet-server`

保存し、終了したらファイルを閉じます。

Agentノードで/etc/hostsと/etc/hostnameファイルを開き、以下の変更を行います。

`sudo nano /etc/hosts`

ファイルの最後に以下の行を追加します。

`192.168.0.0.103 puppet-server`

`sudo nano /etc/hostname`

以下のようにファイルを変更します。

`puppet-agent`

終了したら保存して閉じてください。

####Puppetのインストール
Ubuntu 16.04のデフォルトリポジトリではPuppetサーバーは利用できません。そのため、MasterノードとAgentノードの両方にPuppet Labリポジトリを追加する必要があります。

それぞれのノードで以下のコマンドを実行して、Puppetのリポジトリをダウンロードしてインストールします。

```
wget https://apt.puppetlabs.com/puppetlabs-release-pc1-xenial.deb
sudo dpkg -i puppetlabs-release-pc1-xenial.deb
sudo apt-get update -y
```

次に、以下のコマンドでマスターノードにPuppetサーバパッケージをインストールします。

`sudo apt-get install puppetserver -y`

Puppetサーバをインストールした後、メモリの割り当てを設定する必要があります。マスターノードのメモリ量に応じてメモリ使用量をカスタマイズすることをお勧めします。これは/etc/default/puppetserverファイルを編集することで行うことができます。

`sudo nano /etc/default/puppetserver`

サーバーの容量に合わせて行を変更してください。

以下の行を変更してください。

`JAVA_ARGS="-Xms2g -Xmx2g -XX:MaxPermSize=256m”`から

`JAVA_ARGS="-Xms512m -Xmx512m”`へ。

保存してファイルを閉じ、以下のコマンドでPuppetサーバを起動し、起動時に起動できるようにします。

```
sudo systemctl start puppetserver
sudo systemctl enable puppetserver
```

Puppetサーバーの状態は以下のコマンドで確認できます。

`sudo systemctl status puppetserver`

すべてが正常な場合は、以下のような出力が表示されるはずです。

```
● puppetserver.service - puppetserver Service
   Loaded: loaded (/lib/systemd/system/puppetserver.service; enabled; vendor preset: enabled)
   Active: active (running) since Sat 2017-10-28 18:47:26 IST; 12min ago
  Process: 887 ExecStart=/opt/puppetlabs/server/apps/puppetserver/bin/puppetserver start (code=exited, status=0/SUCCESS)
 Main PID: 963 (java)
   CGroup: /system.slice/puppetserver.service
           └─963 /usr/bin/java -Xms256m -Xmx256m -Djava.security.egd=/dev/urandom -XX:OnOutOfMemoryError=kill -9 %p -cp /opt/puppetlabs/server/
```

####Puppet Agentのインストール
これでPuppetサーバーは稼働しています。いよいよAgentノードにPuppet agentをインストールする時が来ました。

Puppet agentをインストールする前に、AgentノードにPuppet Labリポジトリがインストールされていることを確認してください。次に、以下のコマンドを実行するだけでPuppet agentをインストールします。

`sudo apt-get install puppet-agent -y`

Puppet Agentをインストールしたら、puppet設定ファイルを編集し、puppetマスター情報を設定する必要があります。

これは以下のコマンドで行うことができます。

`sudo nano /etc/puppetlabs/puppet/puppet.conf`

以下の行を追加します。

```
[main]
certname = puppet-agent
server = puppet-server
environment = IT
```

保存してファイルを閉じ、以下のコマンドでPuppet Agentサービスを起動し、起動時に起動できるようにします。

```
sudo systemctl start puppet
sudo systemctl enable puppet
```

####パペットサーバー上のパペットエージェント証明書に署名する
Puppetが初めてAgentノードを実行するとき、Puppetはパペットサーバに証明書署名要求を送信します。クライアント・サーバ型のアーキテクチャでは、エージェントノードを制御するために、パペットマスターサーバが各エージェントノードの証明書要求を承認する必要があります。

パペットサーバ上で、以下のコマンドですべての署名されていない証明書要求をリストアップします。

`sudo /opt/puppetlabs/bin/puppet cert list`

エージェントノードのホスト名で1つのリクエストが表示されているはずです。

`"puppet-agent" (SHA256) 7C:28:E8:AF:09:23:55:19:AF:C1:EE:C3:66:F2:02:73:AD:7F:53:17:28:CE:B0:26:AE:C7:6C:67:16:05:6F:2E`

次に、以下のコマンドで証明書要求に署名します。

`sudo /opt/puppetlabs/bin/puppet cert sign puppet-agent`

以下のような出力が表示されるはずです。

```
Signing Certificate Request for:
  "puppet-agent" (SHA256) 7C:28:E8:AF:09:23:55:19:AF:C1:EE:C3:66:F2:02:73:AD:7F:53:17:28:CE:B0:26:AE:C7:6C:67:16:05:6F:2E
Notice: Signed certificate request for puppet-agent
Notice: Removing file Puppet::SSL::CertificateRequest puppet-agent at '/etc/puppetlabs/puppet/ssl/ca/requests/puppet-agent.pem'
```

これでパペットマスターサーバーはAgentノードと通信して制御できるようになりました。複数のノードの証明書要求に一度に署名したい場合は、以下のコマンドを実行します。

`sudo /opt/puppetlabs/bin/puppet cert sign —all`

PuppetマスターがPuppet Agent証明書に署名したら、Puppet Agentノードで以下のコマンドを実行してテストします。

`sudo /opt/puppetlabs/bin/puppet agent —test`

すべてが正しく行われていれば、以下のような出力が表示されるはずです。

```
Info: Using configured environment 'production'
Info: Retrieving pluginfacts
Info: Retrieving plugin
Info: Caching catalog for puppet-agent
Info: Applying configuration version '1509200872'
Notice: Applied catalog in 0.09 seconds
```

####エージェントノードにApacheをインストールするためにPuppetサーバを設定する
これでPuppetマスター、エージェントノードともに設定が完了し、機能するようになりました。いよいよPuppetを検証してみましょう。

そのために、AgentノードにApacheウェブサーバをインストールするためのマニフェストファイルを作成します。マニフェストはクライアントの設定を含むデータファイルです。デフォルトでは、マニフェストファイルは /etc/puppetlabs/code/environments/production/manifests/directory.にあります。

マニフェストファイルの作成に進む前に、puppetlabs-apacheモジュールをインストールする必要があります。

Puppetマスターノードで、以下のコマンドを実行して、puppetlabs-apacheモジュールをインストールします。

`sudo /opt/puppetlabs/bin/puppet module install puppetlabs-apache`

以下のような出力が表示されるはずです。

```
Notice: Preparing to install into /etc/puppetlabs/code/environments/production/modules ...
Notice: Downloading from https://forgeapi.puppet.com ...
Notice: Installing -- do not interrupt ...
/etc/puppetlabs/code/environments/production/modules
└─┬ puppetlabs-apache (v2.3.0)
  ├── puppetlabs-concat (v4.1.0)
  └── puppetlabs-stdlib (v4.20.0)
```

次に、以下のコマンドでPuppetマスター上にマニフェストファイルを作成します。

`sudo nano /etc/puppetlabs/code/environments/production/manifests/site.pp`

以下の行を追加します。

```
node 'puppet-agent' {
  class { 'apache': }             # use apache module
  apache::vhost { 'localhost':  # define vhost resource
    port    => '80',
    docroot => '/var/www/html'
  }
}
```

上記の設定では、Apacheをインストールし、localhostというバーチャルホストを設定し、80番ポートでリスニングし、Agentノード上にドキュメントルート/var/www/htmlを持つようにします。

さて、Agentノード上で以下のコマンドを実行して、マニフェストファイルからすべての設定を取得します。

`sudo /opt/puppetlabs/bin/puppet agent —test`

すべてが成功した場合、以下のような出力が表示されるはずです。

``
Notice: /Stage[main]/Apache/Apache::Vhost[default]/File[15-default.conf symlink]/ensure: created
Info: /Stage[main]/Apache/Apache::Vhost[default]/File[15-default.conf symlink]: Scheduling refresh of Class[Apache::Service]
Notice: /Stage[main]/Main/Node[puppet-agent]/Apache::Vhost[localhost]/Concat[25-localhost.conf]/File[/etc/apache2/sites-available/25-localhost.conf]/ensure: defined content as '{md5}05a8b8c6772009021086814bdf8c985e'
Info: Concat[25-localhost.conf]: Scheduling refresh of Class[Apache::Service]
Notice: /Stage[main]/Main/Node[puppet-agent]/Apache::Vhost[localhost]/File[25-localhost.conf symlink]/ensure: created
Info: /Stage[main]/Main/Node[puppet-agent]/Apache::Vhost[localhost]/File[25-localhost.conf symlink]: Scheduling refresh of Class[Apache::Service]
Info: Class[Apache::Service]: Scheduling refresh of Service[httpd]
Notice: /Stage[main]/Apache::Service/Service[httpd]: Triggered 'refresh' from 1 events
Notice: Applied catalog in 53.11 seconds
```

おめでとうございます。これで Apache が Agent ノードにインストールされ、実行されています。

####結論
このチュートリアルでは、本番環境にPuppetサーバーを簡単にインストールし、ITインフラ全体を簡単に管理することができます。Puppetの詳細については、Puppetの公式ドキュメントページを参照してください。その他のチュートリアルは、[Alibaba Cloud Getting Started](https://www.alibabacloud.com/ja/getting-started)チャンネルにも掲載されています。

*アリババクラウドは日本に２つのデータセンターを有し、世界で60を超えるアベラビリティーゾーンを有するアジア太平洋地域No.1(2019ガートナー)のクラウドインフラ事業者です。
アリババクラウドの詳細は、こちらからご覧ください。
[アリババクラウドジャパン公式ページ](https://www.alibabacloud.com/ja)*