Puppet Dashboardを使ってみよう！

Puppet Advent Calendar 2015の、20日目です。

ラストスパートな時期になってますが、Puppeteerの一人として遅ればせながら参加させて頂きます！(ﾟ∀ﾟ)

ネタはPuppet Dashboardです。OSSのPuppet用WebUIで、商用であるPuppet Enterpriseのベースとなっているものです。まぁPuppet Enterpriseに注力するためか、売るためかだとは思いますが、今はもう更新が止まってますが…(´･ω･`)

でも使うのは自由ですし、比較的軽いしOSS Puppetとの相性も良いので、OSS Puppet使っている方は試してみる価値アリですよ((´∀｀))

あ、それとこれは以前作ったメモをベースに実機で試さずに書くので、もしかすると間違いがあるかもです。もし間違いがありましたらツッコミ入れてください（；´∀｀）

# Puppet Dashboardとはなにか

Puppet DashboardはRuby on Railsで記述されたPuppetのWeb Interfaceです。Puppetのレポートの解析、パラメータ指定を含むクラスの適用、インベントリ情報やバックアップファイルの閲覧が可能です。

UNIX系OSであるMacOS Xや殆どのLinuxディストリビュージョン上で動作します。ブラウザはChrome、Firefox、Safari、IE8移行で動作します。

# Puppet Dashboardのインストール

Puppet Labsのyumリポジトリを登録した後、以下のパッケージをインストールします。

Puppet Labsのyumリポジトリ登録の方法は以下の記事を参照してください。

[新人インフラ技術者のためのサーバー構築／運用自動化入門（3）：Puppetのインストールと動作確認、トラブル対処法](http://www.atmarkit.co.jp/ait/articles/1410/08/news016.html)

```
# yum install puppet-server puppet-dashboard mysql-server
```

なお依存パッケージであるruby-gen、rakeパッケージはRHEL標準に入っていませんので、RHNから持ってくるかyum使うか、CentOSから持ってこないとなりません。

# Puppet Dashboardの設定

## database.ymlの設定

Puppet Dashboard自体Ruby on Railで作られているため、実体はRailsのデータベース設定ファイルそのものになります。

**host**
　MySQLサーバのホスト名。ローカルにあるなら不要。
**database**
　MySQLのデータベース名を記述する。必要無ければデフォルトのまま。
**username**
　MySQLに接続するユーザ名。デフォルトはdashboard。
**password**
　MySQLに接続するユーザのパスワード。必要に応じて変更のこと。
**encoding**
　データベースの文字コード。デフォルトのまま。
**adapter**
　MySQLでよいので変更しない。
以下、書き換えの例です。

```
# vi /usr/share/puppet-dashboard/config/database.yml

-----------
# At the moment, "adapter" can only be "mysql", and "encoding" should always
# be "utf8".
#
production:
#  database: dashboard_production
  database: dashboard
  username: dashboard
  password: my_password
  encoding: utf8
  adapter: mysql

development:
  database: dashboard_development
  username: dashboard
  password: my_password
  encoding: utf8
  adapter: mysql

test:
  database: dashboard_test
  username: dashboard
  password: my_password
  encoding: utf8
  adapter: mysql
-----------
```

# settings.ymlの設定

/usr/share/puppet-dashboard/config/settings.yml に記述します。

重要な変更箇所は以下の通りです。

**cn_name**
　Puppet masterへの接続で使う認証名で、デフォルトは「dashboard」です。
**ca_server**
　Puppet CAの場所です。
　通常はmasterと同居しているためmasterのホスト名となります。
　もしmasterとCAを分離しているのであればCAのホスト名を記述します。
**enable_inventory_service**
　インベントリサービスの利用可否で、デフォルトはfalseです。
　trueにするとfacterで取得した情報をnode画面で閲覧できますが、
　master側にauth.confの設定が必要です（後述）。
**use_file_bucket_diffs**
　ファイルバケットの利用有無を記述し、デフォルトはfalseです。
　ファイル変更が生じた時、変更前のファイルをPuppet master側で
　保管する機能がファイルバケット。trueにすると保管したファイルを
　Event画面から閲覧可能になります。
**file_bucket_server**
　ファイルバケットサーバのホスト名を記述します。
　通常はPuppet masterと同一です。
**use_external_node_classification**
　ENC(External Node Classification)の利用可否を記述します。
　デフォルトはtrueです。
　trueにするとマニフェストレスでのClass適用が可能になります。

以下、書き換えの例です。

```
# vi /usr/share/puppet-dashboard/config/settings.yml

-----------

#---[ Values ]----------------------------------------------------------

# Node name to use when contacting the puppet master.  This is the
# CN that is used in Dashboard's certificate.
cn_name: 'dashboard'                   ←←←確認！
 :
# Hostname of the certificate authority.
ca_server: 'vpwin7'                    ←←←修正！
 :
# The "inventory service" allows you to connect to a puppet master to retrieve and node facts
enable_inventory_service: true         ←←←修正！
 :
# Hostname of the inventory server.
inventory_server: 'vpwin7'             ←←←修正！
 :
# Set this to true to allow Dashboard to display diffs on files that
# are archived in the file bucket.
use_file_bucket_diffs: true            ←←←修正！
 :
# Hostname of the file bucket server.
file_bucket_server: 'vpwin7'           ←←←修正！
 :
# How many days of history to display on the "Daily Run Status" graph
daily_run_history_length: 30
 :
use_external_node_classification: true  ←←←確認！
 :
# Uncomment the following line to set a local time zone.  Run
# "rake time:zones:local" for the name of your local time zone.
#time_zone: 'Pacific Time (US & Canada)
time_zone: 'Tokyo' 　　　　　　　　　  ←←←追加！
-----------
```

# データベースの初期化

以下の手順でデータベースを初期化します。


1) /etc/my.cnf の設定
MySQLの設定ファイルに以下の行を追加します。

```
# vi /etc/my.cnf
---
# Allowing 32MB allows an occasional 17MB row with plenty of spare room
max_allowed_packet = 32M
---
```

2) MySQLサービスの起動

```
# chkconfig mysqld on
# service mysqld start
```

3) データベースの作成

以下のSQLを実行してデータベースを作成します。

```
# mysql
mysql> 

# dashboardユーザの作成
CREATE USER 'dashboard'@'localhost' IDENTIFIED BY 'my_password';

# production用データベース作成
CREATE DATABASE dashboard_production CHARACTER SET utf8;
GRANT ALL PRIVILEGES ON dashboard_production.* TO 'dashboard'@'localhost';

# development用データベース作成
CREATE DATABASE dashboard_development CHARACTER SET utf8;
GRANT ALL PRIVILEGES ON dashboard_development.* TO 'dashboard'@'localhost';

# test用データベース作成
CREATE DATABASE dashboard_test CHARACTER SET utf8;
GRANT ALL PRIVILEGES ON dashboard_test.* TO 'dashboard'@'localhost';


# 必要であれば、以下のように外部からデータベースへの接続を許可する
GRANT ALL PRIVILEGES ON dashboard_production.* TO dashboard@"172.17.0.%" identified by 'my_password' with grant option;
GRANT ALL PRIVILEGES ON dashboard_development.* TO dashboard@"172.17.0.%" identified by 'my_password' with grant option;GRANT ALL PRIVILEGES ON dashboard_test.* TO dashboard@"172.17.0.%" identified by 'my_password' with grant option;
```

4) データベースの初期化

以下のコマンドラインでデータベースを初期化します。

```
# cd /usr/share/puppet-dashboard/
# rake RAILS_ENV=production db:migrate
```

# Puppet master側の設定

## /etc/puppet/puppet.conf の設定

agentセクション、masterセクションの内容双方を追加します。

```
# vi /etc/puppet/puppet.conf
---
  [main]
    modulepath = /etc/puppet/modules/site:/etc/puppet/modules/dist
    show_diff = true

  [agent]
    server = [puppet masterのホスト名]
    report = true

  [master]
    reports = store, http
    reporturl = http://[Puppet Dashboardマシン]:3000/reports/upload
    node_terminus = exec
    external_nodes = /usr/share/puppet-dashboard/bin/external_node
---
```

## /etc/puppet/autosign.conf の設定

とりあえず動けばよいので、内容が“*”だけのファイルを作成します。ホントはセキュリティ的によろしくないですが、面倒だし今回はヨシとします。

```
# vi /etc/puppet/autosign.conf
---
*
---
```

## /etc/puppet/auth.conf の設定

auth.conf に以下のブロックを追加しインベントリサポートの有効化します。末尾に追加すると設定が無視されてしまうので、以下にあるような最初のコメントブロックの直後に挿入しておきましょう。

```
---
### Authenticated ACLs - these rules apply only when the client
### has a valid certificate and is thus authenticated
---


# vi /etc/puppet/auth.conf
---
### Authenticated ACLs - these rules apply only when the client
### has a valid certificate and is thus authenticated
path /facts
auth yes
method find, search
allow dashboard
---
```

## filebucketの有効化

マニフェストのエントリポイントであるsite.ppに以下のブロックを追加します。

```
# vi /etc/puppet/manifests/site.pp
---
filebucket { "main":
  server => "[Puppet masterのホスト名]",    ←←←修正！
  path => false,
}
File { backup => "main" }
---
```

filebucketについては以下の記事を参照してください。

[新人インフラ技術者のためのサーバー構築／運用自動化入門（終）：
GitやDockerと連携するPuppet運用テクニック、filebucketによる自動バックアップ、GUIのPuppet Dashboard](http://www.atmarkit.co.jp/ait/articles/1504/06/news008.html)

# Puppet agent側の設定

## /etc/puppet/puppet.conf の設定

agentセクションの内容を追加します。
※デフォルトのままで追加しなくても大丈夫な模様(´･ω･`)

```
# vi /etc/puppet/puppet.conf
---
  [main]
    show_diff = true

  [agent]
    server = [puppet masterのホスト名]
    report = true
---
```

# SSL証明書の生成

以下の手順でPuppet masterを起動し、dashboardのSSL証明書を生成します。

```
# chkconfig puppetmaster on
# service puppetmaster start

# cd /usr/share/puppet-dashboard/

# sudo -u puppet-dashboard rake cert:create_key_pair
# sudo -u puppet-dashboard rake cert:request

# puppet cert sign --all
# sudo -u puppet-dashboard rake cert:retrieve
```

# Puppet Dashboard起動

以下のコマンドラインで起動します。

```
# chkconfig puppet-dashboard on
# service puppet-dashboard start
```

# 動作確認

ブラウザで**http://[Dashboardのマシン]:3000/**に接続できるか確認します。

確認できたらPuppet master上で以下のコマンドラインを実行し、Puppet agentを即時実行します。

```
# puppet agent -t
```

実行後、画面左上の"Background Tasks"の下に"1 pending task"が表示されたら疎通は問題ありません。遅延ジョブワーカを起動した時点で処理されます。

# 遅延ジョブワーカの起動

遅延ジョブワーカは初回にログのパーミッションを変更するよう警告が出るため、初回起動後に一度停止し、パーミッション変更後に再起動します。

以下のコマンドラインで実行します。

```
# chkconfig puppet-dashboard-workers on
# service puppet-dashboard-workers start

# chmod 666 /usr/share/puppet-dashboard/log/production.log
# service puppet-dashboard-workers restart
```
# トラブルシュート

Webrickの逆引き問題により、リゾルバの設定が適切でない場合は極端に遅くなります。デフォルトではresolv.confにダミーが設定されるDocker環境などでは要注意です。このような場合はWebrickの逆引きを無効にします。

**/usr/lib/ruby/1.8/webrick/config.rb**に以下の行を追加してください。

```
# vi /usr/lib/ruby/1.8/webrick/config.rb

---
:DoNotReverseLookup => true,
---
```

またDocker環境ではEntrypointでresolv.confを差し替えたり、オプションでDNSを指定してダミーのDNSにアクセスしないようにする必要がありますのでご注意ください。。

なお、MySQLでも同様の問題があるため、/etc/my.cnfに以下の行を追加します。

```
---
[mysqld]
skip-name-resolve
---
```

# Puppet Dashboardで適用するクラス

GUIからmodulepathで参照可能なクラスやモジュールのクラス適用ができます。

ただしクラス間の依存関係はPuppet Dashboard側から指定できないため、クラスやモジュール同士は疎結合であることが要求されます。よって呼びだされるクラスやモジュールは、それぞれが単独で動作可能でなければなりません。

クラス側に依存関係を予め記述しておくことは可能ですが、Puppet Dashboard側で依存するクラスの指定を失念すればエラーになるので推奨できる方法ではありません。

Puppet Dashboardで指定したパラメータは、パラメータ名が変数名となって、クラス側からグローバル変数として参照できるようになります。そのためクラス側で受け取れるようにしておかなければなりません。

受け取る書式は以下のようになります（$::[変数名] がグローバル変数の指定）。

```
---
$servername = $::servername,
---
```

# WebUIの操作

基本的に見ての通りに操作できるので特筆する事項はありません。必要であれば以下のドキュメントを参照してください。

[Puppet Enterprise User's Guide](https://docs.puppetlabs.com/pe/latest/)
※Puppet EnterpriseはDashboardの拡張であるため基本操作はほぼ同じ

**注意：** “File Search”についてはリンクがあるが機能は廃止されており、正しく情報を入力してもクエリ結果は常に0件となります