Puppet DiscoveryをCentOS7にインストールしてGCEインスタンスを検出してみた

既存資産を正確に把握することがDevOpsの出発地点と言われていますがPuppet Discoveryは今までの資産管理と何が違うのでしょうか?

# Puppet Discoveryとは?
Puppet DiscoveryはPuppet社が提供している資産管理ツールです。検知対象ノードへのエージェントのインストールは不要でOS標準のSSH/WinRMプロトコルでノードにインストールされたSoftware Packageの情報を取得します。手軽に開始できることが最大の売りです。
[Puppet Discovery](https://puppet.com/products/puppet-discovery)

# 前提条件
- **OS** : CentOS 7(3.10.0-957.1.3.el7.x86_64)
- **Puppet Discovery** : 1.8.0 Build: b2f5c3c

# インストール
Puppet DiscoveryはDockerコンテナ上で稼働するApplicationです。インストールするにはDockerがインストールされている必要があります。この記事では[こちら](https://qiita.com/inakadegaebal/items/be9fecce813cebec5986)の記事を参考にインストールしています。

[Puppet社のライセンス管理サイト](https://licenses.puppet.com/signup)から30日間無償で利用可能な評価版ライセンスを入手します。アカウントの登録が必要です。

[Puppet社のダウンロードサイト](https://storage.googleapis.com/chvwcgv0lwrpc2nvdmvyes1jbgkk/production/latest/linux-amd64/puppet-discovery)からバイナリをダウンロードして実行権限を付与します。

```bash
$ chmod a+x ./puppet-discovery
```

startで開始します。

```bash
$ ./puppet-discovery start
```

ライセンスファイルのパスを指定します。

```bash
Please enter the path to your Puppet Discovery license: /tmp/discovery_license.json
```

End User License Agreementを承諾します。

```bash
Do you agree? [y/n]:y
```

adminのパスワードを設定します。パスワードポリシーが少々厳しいので注意が必要です。

```bash
Password requirements:
* Password must have at least 6 characters
* Password must use at least 3 of the 4 character types: lowercase letters, uppercase letters, numbers, symbols
* Password cannot be the same as current password

Please create an admin password: *********
Verify by entering the same password again: *********
```

下記のメッセージが表示されればインストールと起動は成功です。

```
Puppet Discovery: started        11s [====================================================================] 100%
Puppet Discovery: pulled [9/9] 1m58s [====================================================================] 100%
Opening Puppet Discovery at https://localhost:8443 ...

Navigate to https://localhost:8443 to access Puppet Discovery dashboard
```

念の為コンテナの稼働状況を確認します。

```bash
$ docker ps --all
CONTAINER ID        IMAGE                                         COMMAND                  CREATED              STATUS              PORTS                                         NAMES
182e5908aba3        gcr.io/puppet-discovery/frontdoor:1.8.0       "nginx -g 'daemon of…"   About a minute ago   Up About a minute   0.0.0.0:8080->80/tcp, 0.0.0.0:8443->443/tcp   pd_ingress
3f770b4f270a        gcr.io/puppet-discovery/node-ui:1.8.0         "/usr/src/app/entryp…"   About a minute ago   Up About a minute                                                 pd_ui
c47e768b79f9        gcr.io/puppet-discovery/licensing-api:1.8.0   "/entrypoint.sh"         About a minute ago   Up About a minute   8443/tcp                                      pd_licensing
50f9ba074ac5        gcr.io/puppet-discovery/pdp-go:1.8.0          "/app/entrypoint.sh"     About a minute ago   Up About a minute   8082-8084/tcp, 8087/tcp                       pd_gopdp
30c392dd9caa        gcr.io/puppet-discovery/edge:1.8.0            "/edge-svc"              About a minute ago   Up About a minute   9997/tcp                                      pd_edge
9bbe2c5cec08        gcr.io/puppet-discovery/pd-storage:1.8.0      "docker-entrypoint.s…"   About a minute ago   Up About a minute   5432/tcp                                      pd_storage
3b6f9db9d56f        gcr.io/puppet-discovery/controller:1.8.0      "/controller-svc"        About a minute ago   Up About a minute   9999/tcp                                      pd_controller
64792ab0569b        gcr.io/puppet-discovery/pdp-desktop:1.8.0     "/app/pdp-env /app/c…"   About a minute ago   Up About a minute   8083-8085/tcp                                 pd_pdp
85bd617eae71        gcr.io/puppet-discovery/pdp-proxy:1.8.0       "/pdp-proxy-svc"         About a minute ago   Up About a minute   9200/tcp                                      pd_export
01c334f522fe        gcr.io/puppet-discovery/pd-dex:1.8.0          "/entrypoint.sh serv…"   3 minutes ago        Up 3 minutes        0.0.0.0:5556->5556/tcp                        pd_dex
061fec8467cb        vault:0.9.0                                   "docker-entrypoint.s…"   4 minutes ago        Up 3 minutes        0.0.0.0:8200->8200/tcp                        pd_vault
```

# 検出
GCEのインスタンスを検出します。この記事ではOS ImageはCentOS7を利用していることとします。
事前にGCPのコンソールから検出対象のインスタンスが稼働しているプロジェクトのService Accountの情報をダウンロードしておきます。IAM & admin -> Service accountsを選択します。
<img src="https://i.imgur.com/sFRsriR.png" width=50%>


Actions -> Create keyを選択します。
<img src="https://i.imgur.com/ihMACjM.png" width=100%>


Puppet Discoveryのコンソールにアクセスします。Chromeからhttps://<ホスト名>:8443にアクセスしてインストール時に設定したadminのパスワードを入力しサインインを押します。
<img src="https://i.imgur.com/vinVT5N.png" width=50%>


検出を開始しましょうを押します。
<img src="https://i.imgur.com/tubfI1W.png width=50%>


事前にダウンロードしたService accountsのファイルから必要な情報をコピーして入力し検出を押します。次の画面で次へを押します。
<img src="https://i.imgur.com/i6FP7j1.png" width=50%>


ホスト認証情報を追加します。この記事ではSSH Private Keyを使用します。SSH秘密鍵ファイルを押し、GCEインスタンスに登録してある公開鍵のペアとなっている秘密鍵を選択し鍵の設定を押します。
<img src="https://i.imgur.com/Kp0rWZN.png" width=50%>


3つのチェックボックス全て選択して秘密鍵のユーザ名とパスフレーズを入力し鍵の追加を押します。次の画面でダッシュボートを表示を押します。
<img src="https://i.imgur.com/pnrlKnY.png" width=50%>


検出を開始します。しばらくすると検出データがダッシュボードに表示されます。All set!
<img src="https://i.imgur.com/s5wIO0Y.png" width=50%>

# おわりに
この記事では例としてGCPインスタンスを検出していますが、Puppet DiscoveryはAWS, Azure, VMware, Open Stack等主要なクラウドプラットフォームのインスタンスを検出することが可能です。もちろんベアメタルも。
稼働しているSoftware Package資産をExcel台帳で管理されているお客様は多くいらっしゃると感じています。Excel管理は更新漏れ等で実際の環境内容は異なっていて台帳は意味をなしていないケースがほとんどではないでしょうか?
Puppet Discoveryを利用してクラウドネイティブな資産管理にシフトすることをおすすめします!