Continuous Delivery for Puppet Enterpriseをセットアップしてみた

あらゆるスタックがSoftwareで定義されるCloud Native WorldではビジネスアプリケーションだけでなくインフラストラクチャコードのCI/CDも必要ですね。この記事は[こちらの原文](https://puppet.com/docs/continuous-delivery/2.x/install_set_up.html)を元に作成しています。


# Continuous Delivery for Puppet Enterpriseとは?
[Continuous Delivery for Puppet Enterprise(以下CD4PE)](https://puppet.com/docs/continuous-delivery/2.x/cd_user_guide.html)はPuppet Enterpriseで管理するインフラストラクチャコードのデリバリーパイプライン管理ツールです。コード変更によるインフラストラクチャへの影響分析やアドオンのテスティングフレームワークと連携してコードの品質を担保しながらデリバリーのスピードと頻度を高めます。


# 前提条件
- **OS** : CentOS 7(3.10.0-957.1.3.el7.x86_64)
- **Puppet MasterのOS** : CentOS7
- **CD4PEのOS** : CentOS7
- **Job hardwareのOS** : CentOS7
- **Puppet Enterprise** : 6.0.5
- **CD4PE** : 2.5.0


# インストール
Puppet社のサイトから[Puppet Enterprise](https://pm.puppet.com/cgi-bin/download.cgi?dist=el&rel=7&arch=x86_64&ver=latest)をダウンロードします。

**[Code Managerの設定](https://puppet.com/docs/pe/2017.3/code_mgr_config.html#enable-code-manager-during-installation)が必要です。この記事では詳細な手順は割愛しています。**

Master側でダウンロード済みのPuppet Enterpriseのインストールバイナリを解いてインストールスクリプトを実行します。

```bash
$ sudo ./puppet-enterprise-installer
どのように続行しますか? [1]: 1
省略
## Puppet Enterpriseの設定が完了しました!
省略
```

puppetを実行してインストールは完了です。

```bash
$ sudo /opt/puppetlabs/bin/puppet agent -t
```

CD4PE側でAgentのインストールスクリプトを実行します。

```bash
$ curl -k https:<Puppet Masterのホスト名>:8140/packages/current/install.bash | sudo bash
```

CD4PE側でpuppetを実行してMasterに証明書のサインを要求します。


```bash
$ sudo /opt/puppetlabs/bin/puppet agent -t

```

Master側で証明書にサインします。

```bash
$ sudo /opt/puppetlabs/bin/puppetserver ca sign --all
Successfully signed certificate request for device-proxy.puppet.com
```

再度CD4PE側でpuppetを実行します。エラーが出なければ成功です。

```bash
$ sudo /opt/puppetlabs/bin/puppet agent -t
```

Mater側でCode Managerの設定時に設定したリポジトリをディプロイします。[Puppet社が管理しているGitHubリポジトリ](https://github.com/puppetlabs-seteam/control-repo)

```bash
$ sudo puppet-code deploy production
Found 1 environments.
[
  {
    "environment": "production",
    "id": 1,
    "status": "queued"
  }
]
```

Chromeでhttps://<Masterのホスト名>にアクセスしてMasterの管理コンソールにログインします。左のペインで分類を選択してグループを追加をクリックします。親名はPE Infrastructure, グループ名はContinuous Delivery for PE, Environmentはproduction, Environmentグループのチェックは選択せずに追加を押します。
<img src="https://i.imgur.com/DXj32tw.png" width=50%>

作成したContinuous Delivery for PEをクリックして設定タブを選択します。新しいクラスを追加からcd4peを選択してクラスを追加を押します。
<img src="https://i.imgur.com/ueisiQE.png" width=50%>

CD4PE側でpuppetを実行します。エラーがでなければCD4PEのインストールは成功です。念の為dockerがインストールされていてコンテナが作成されているか確認します。

```bash
$ sudo /opt/puppetlabs/bin/puppet agent -t
省略
$ docker ps --all
CONTAINER ID        IMAGE                                                     COMMAND                  CREATED             STATUS              PORTS                                                                    NAMES
f06906936ac6        puppet/continuous-delivery-for-puppet-enterprise:latest   "/sbin/init"             6 hours ago         Up 6 hours          0.0.0.0:7000->7000/tcp, 0.0.0.0:8000->8000/tcp, 0.0.0.0:8080->8080/tcp   cd4pe
19298955a926        mysql:5.7                                                 "docker-entrypoint.s…"   6 hours ago         Up 6 hours          0.0.0.0:3306->3306/tcp, 33060/tcp                                        cd4pe_mysql
```


# Rootアカウントの設定
Chromeで[Puppet社のライセンス管理サイト](https://licenses.puppet.com/)にアクセスしてCD4PEの評価版ライセンスをダウンロードします。ユーザ登録が必要です。

Chromeでhttp://<CD4PEのホスト名>:8080にアクセスしてGet Startedを押します。
<img src="https://i.imgur.com/xQmAyYm.png" width=50%>

Rootアカウントを作成します。**このアカウントは管理専用でデリバリーパイプラインを作成できません。**
<img src="https://i.imgur.com/fnOHVlC.png" width=50%>

End Pointを設定します。ホスト名はFQDNを入力します。
<img src="https://i.imgur.com/yYntoiq.png" width=50%>

Storageを設定します。この記事ではローカルディスクを選択しています。
<img src="https://i.imgur.com/MCGxj2o.png" width=50%>

ライセンスを投入してSubmit Licenseを押してライセンス確認の画面でAcceptを押します。
<img src="https://i.imgur.com/hTLdhhZ.png" width=50%>

下記の画面が表示されれば管理者アカウントの設定は成功です。
<img src="https://i.imgur.com/tOFxc7T.png" width=50%>


# 初期設定
必要情報を入力してSign Upを押します。
<img src="https://i.imgur.com/x5Sissb.png" width=50%>

Integrate Puppet EnterpriseをクリックしてAdd Credentialsを押します。
<img src="https://i.imgur.com/gF2qVNr.png" width=50%>
<img src="https://i.imgur.com/Ae3k6e9.png" width=50%>

Master側でAPI Tokenを作成します。

```bash
$ sudo puppet-access login --lifetime 180d
```

Master側で作成したAPI Tokenをコピーして控えておきます。

```bash
$ sudo puppet-access show
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
```

Master側で証明書をコピーして控えておきます。権限の都合上rootで実行します。

```bash
# cat /etc/puppetlabs/puppet/ssl/certs/<MasterのFQDN.pem>
```

Master側で秘密鍵をコピーして控えておきます。権限の都合上rootで実行します。

```bash
# cat /etc/puppetlabs/puppet/ssl/private_keys/<MasterのFQDN.pem>
```

必要情報を入力してAdd Credentialsを押します。この記事ではAPI Token認証を選択しています。
<img src="https://i.imgur.com/PggP0Yr.png" width=50%>

右上のLogoutをクリックして一旦ログアウトしRootアカウントでログインします。
<img src="https://i.imgur.com/uQlbrhQ.png" width=50%>
<img src="https://i.imgur.com/siDDqNY.png" width=50%>

Settings->IntegrationをクリックしGitHub OAuth applicationのClient ID, Client Secretを入力してAddをクリックします。**この記事ではGitHubと連携しています。OAuth applicationの作成方法は割愛しています。**[参考](https://developer.github.com/apps/building-oauth-apps/creating-an-oauth-app/)
設定が終わったら再度一般ユーザでログインします。
<img src="https://i.imgur.com/4JoPm6F.png" width=50%>

Integrate source control->GitHubをクリックします。
<img src="https://i.imgur.com/nXzxbap.png" width=50%>

Add Credentialsを押してGitHubと連携します。
<img src="https://i.imgur.com/i0CBTkX.png" width=50%>
<img src="https://i.imgur.com/0t4fgRz.png" width=50%>

Set up job hardware->Add job hardwareを押します。
<img src="https://i.imgur.com/zxWfoU8.png" width=50%>

Job hardwareのインスタンスにログインしてインストラクションに従ってCD4PEのAgentをインストールします。

```bash
$ curl -sSL http://iacd.c.metal-being-226004.internal:8080/download/client | sh
```

```bash
$ sudo /usr/local/bin/distelli agent install
Login can be automated. See: http://pup.pt/pipe-agent-creds
Distelli Email: hisashi.yamaguchi@puppet.com
      Password:
Server Info: http://iacd.c.metal-being-226004.internal:8080/hisashiyamaguchi/servers/f4d7c70d-9f2a-6c44-81bd-42010a8e0029
Starting sysv daemon with conf:	/etc/init.d/dtk-supervise-cc1233c06f7ad94a8d34ac610381242f9ae28bb8
Starting Distelli supervisor
```
Job Hardware Activateを選択します。
<img src="https://i.imgur.com/sb0AQBS.png" width=50%>


# おわりに
次回以降デリバリーパイプラインの作成方法をご紹介します。