[Splunk][ハンズオン]Deployment Serverを使ったForwarderの一括管理


## はじめに

Splunkには,*Forwarder*の一括管理のためにDeployment Serverという機能があるよ.
[覚え書き：*Forwarder*の一括管理](https://qiita.com/kyabe/items/c721e766483c7cb10e2b)にそれぞれの役割を書いたから読んでみてね.

この記事ではハンズオン形式で*Deployment Server*を使った*Forwarder*の管理を行うよ.
実施環境の差異を無くしたいから*Docker*使うよ.

## 完成イメージ
![](https://paper-attachments.dropbox.com/s_2DD598CCD095A25FB56DF4EC0399D14F8CF88344C2A776379C2D3F246AB053E9_1590853007010_Handson_Deployment_Server.png)

合計3つのコンテナを使うよ.

* コンテナ1 : *Forwarder*の管理をしながらデータの受信を担当
* コンテナ2,3 : *Forwarder*.データをコンテナ1に送る

Dockerをホストするマシンはなんでもいいよ.

## このハンズオンの注意点

* 想定している読者は「*Docker*や*Linux*の経験が少ないけど突然*Forwarder*の管理を任されて困っている方」だよ.
初めての人でも出来るように必要なコマンドは詳細に記載しているよ.

* ハンズオンで実行するコマンドにはどのマシンで操作するか分かりやすくするためにコマンドの前にマシン名を明記しているよ.
 * (host): Dockerをホストしているマシン
 * (splunk_ds): Development Serverを入れているマシン.完成イメージのコンテナ1にあたる.
 * (forwarder1 or 2): *Forwarder*を入れるマシン.完成イメージのコンテナ2と3にあたる.
 * 例: ホストマシンのターミナルで" docker pull centos "を実行

```
(host) $ docker pull centos 
```

## 用意するもの
大体15分くらいで準備は終わるよ.

- Docker実行環境
    - 手元のOSに合わせてインストールしてね.俺はfor Macを使ったよ.
    - https://docs.docker.com/get-docker/
- 使用するDocker Image
    - Splunk Enterprise [(Docker hub)](https://hub.docker.com/_/splunk-enterprise)
       - この中には Deployment Server を含むSplunkの主要機能が揃ってるよ
    - CentOS[(Docker hub)](https://hub.docker.com/_/centos)
      - *Forwarder*を設定するサーバーにはCentOSを使うよ
      - 公式にサポートされているOSは以下のサイトで確認できるよ
      - https://www.splunk.com/en_us/download/universal-forwarder.html

```
(host) $ docker pull splunk/splunk
(host) $ docker pull centos
```

      
## 実施手順
大まかな実施内容は以下の5ステップだよ
1. [コンテナ作成](#step1-コンテナ作成)
2. [*Deployment Server*の初期設定](#step2-deployment-serverの初期設定)
3. [*Forwarder* の初期設定](#step3-forwarder-の初期設定)
4. [*Deployment Server*から*Forwarder*を一括設定](#step4-deployment-serverからforwarderを一括設定)
5. [Forwarderの動作確認](#step5-forwarderの動作確認)

### Step.1 コンテナ作成
Dockerにコンテナを3つ作るよ.

* Splunk( Deployment Serverが含まれてるよ）

```
(host) $ docker run -d -p 8000:8000 --name splunk_ds -e SPLUNK_START_ARGS=--accept-license -e SPLUNK_PASSWORD=password splunk/splunk:latest
```

初回起動時のライセンス同意や管理者アカウントのパスワード設定もやっちゃうよ.立ち上がるのに1分くらいかな.ちなみに --nameで設定した splunk_ds のds は deployment server の頭文字だよ.
1分くらい待ったら,ブラウザで localhost:8000 にアクセスして動作確認をしよう.
Splunkへのログイン画面が表示されればOKだよ.(ID:admin, Pass:passwordでログイン可能）

* CentOS 2つ
 
```
(host) $  docker run --hostname forwarder1.sample --name forwarder1  -it centos 
(host) $  docker run --hostname forwarder2.sample --name forwarder2  -it centos 
```

作成直後はコンテナに接続した状態になるよ.設定は後から行うので一度抜けるよ（Ctl + P,  Ctl + Q）
ちなみに --hostname で指定した名前はSplunkで受信データを確認する時に見ることになるよ.

最後に各コンテナのIP確認しておこう.

```
(host) $ docker inspect splunk_ds
(host) $ docker inspect forwarder1
(host) $ docker inspect forwarder2
``` 
こんな感じで色々な情報が出るんだけど,今みたいのは IPAddress のところだけ.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57201/97f8d6c7-3fa7-aad5-360a-76b1cf132c8b.png)

俺がやったときはこんな感じだったよ

* splunk_ds → 172.17.0.2
* forwarder1 → 172.17.0.3
* forwarder2 → 172.17.0.4

---- これでコンテナ作成は終わりだよ. ----

### Step.2 Deployment Serverの初期設定

#### ポートの確認

Deployment Serverを設定するのに必要なポートを確認するよ.
必要なポートは2つあってそれぞれの役割はこんな感じだよ.

* 管理ポート  
Splunkの裏側で動いているプロセスが使うポート. *Deployment Server*と*Forwarder*間の設定ファイルのやりとりはこれを使うよ.デフォルトは8089だよ.
* データ受信ポート  
*Forwarder* からのデータを受け付けるポート.デフォルトは9997だよ.
    
確認手順は以下の通りだよ.

**1. Splunkにログイン**
**2. 設定>サーバ設定>全般設定 > 管理ポート欄 → 管理ポート**
画面を触るのが手間だったら下のリンクにアクセスしてみてね
http://localhost:8000/ja-JP/manager/system/server/settings/settings?action=edit

**3. 設定>転送と受信>受信の設定　→ データ受信ポート**
画面を触るのが手間だったら下のリンクにアクセスしてみてね
http://localhost:8000/ja-JP/manager/launcher/data/inputs/tcp/cooked

#### サーバークラスの作成

*Deployment Server*には「このIPにはこの設定ファイルを送る」という定義をサーバークラスって呼んでいるよ.以降の手順を一通り実施すれば感覚的に役割が理解できるから大丈夫だよ.

**1. Splunkの 設定>フォワーダー管理 を開く**

http://localhost:8000/ja-JP/manager/system/deploymentserver

この画面でサーバークラスを作るんだけど
一番最初の状態(＝配信するモノが何も無い状態)だと設定もなにもできないよ.不便だよね.  
なので,まずは機能を有効化するよ.

**2. splunk_dsのターミナル を開く**

```
(host) $ docker exec -it -u splunk splunk_ds bash
```

**3. deployment-appsに適当なディレクトリを作って”何かある状態”にする**

```
(splunk_ds) $ mkdir -p /opt/splunk/etc/deployment-apps/tmp_app
```
    
**4. もう一度 Splunkの 設定>フォワーダー管理 を開く**

サーバークラスの設定ができるようになってるから,次はサーバークラスを作っていくよ.

**5. フォワーダー管理画面 で サーバークラス を作る**
表示されるフォームに以下の内容を設定して保存してね.

* 名前：centos
* Appの追加：さっき作った「tmp_app」を指定
* クライアントの追加：「含める」欄に * を設定

*を設定すると全てのアドレスからの接続を許可するよ.
当然セキュリティリスクが高まるから,本当はIPをきちんと指定した方が良いよ.
    

---- ここまででDeployment Serverの初期設定は終わりだよ. ----

### Step.3 *Forwarder* の初期設定
コンテナ forwarder1 と forwarder2 に対して*Forwarder*の設定をしていくよ.
*Forwarder*にはいくつか種類があるんだけど,中でも軽量で早くセットアップが出来る*Universal Forwarder*を今回は使うよ.
以下の手順を2つのコンテナ両方に実施してね.

**1. Universal *Forwarder* のDL用コマンドを取得**
ブラウザで公式HPのlinux用rpmパッケージのDLページにアクセスしてね.
https://www.splunk.com/en_us/download/universal-forwarder.html#tabs/linux

ページを開いたら Linux 64bit版 rpmのDownload Nowをクリックしてね.自動的にDLされるファイルは使わないよ.
画面が切り替わったら USEFULL TOOLS をクリックして,*Download via Command Line (wget) *をクリック.　表示される DL用コマンド を適当なテキストファイルにコピペしたらOK.

**2. コンテナに接続**

```
(host) $ docker exec -it forwarder1 bash
```

**3. wgetをインストール**
さっき取得したコマンドを実行するために必要なツールをインストールするよ

```
 (forwarder1 or 2) $ yum -y install wget
```

**4. Universal *Forwarder* をDL**
次にさっき取得したコマンドを実行しよう．
カレントディレクトリに splunkforwarder-X.X.X-XXXX.rpmというファイルが作成されるよ.

**5. Universal *Forwarder* をインストール**
作成されたファイルをインストールしよう.

```
(forwarder1 or 2) $ yum -y install splunkforwarder-X.X.X-XXXX.rpm 
```
rpmファイルにはDLしてきたファイルを指定してね.
成功すれば /opt/splunkforwarder ディレクトリにインストールされるよ.

**6. パスを通す**
インストールした*Universal Forwarder*の実行を楽にするためにパスを通しておこう.

```
(forwarder1 or 2) $ echo 'export PATH=/opt/splunkforwarder/bin:$PATH' >> ~/.bash_profile
(forwarder1 or 2) $ source ~/.bash_profile
```

**7. Splunkを起動**
早速インストールした実行しよう.実行途中に管理者IDとパスワードの入力を求められるから好きな値を設定してね.後で使うから忘れないようにね.

```
(forwarder1 or 2) $ splunk start
```

**8. *Deployment Server*を指定**
*Universal Forwarder* と *Deployment Server*をリンクさせよう.

```
(forwarder1 or 2) $ splunk set deploy-poll splunk_dsのIP:管理ポート
例：$ splunk set deploy-poll 172.17.0.2:8089
```

**9. Splunkを再起動**
リンクさせたら再起動が必要だよ.

```
(forwarder1 or 2) $ splunk restart
```

ここまで設定すれば,*Universal Forwarder* が*Deployment Server*に対して設定変更の有無をポーリングするようになるよ.デフォルトのポーリング頻度は1分毎だよ.
ちなみに,*Deployment Server*とリンクした*Forwarder*のことを*Deployment Client*って言うよ.

**10.接続確認**
正しくリンクされていることをsplunk_ds のクラスサーバー画面で確認するよ
http://localhost:8000/ja-JP/manager/system/deploymentserver?t=2
クライアントの数が増えていればリンク成功だよ.
コンテナ forwarder1 or 2 の /opt/splunkforwarder/etc/apps ディレクトリ配下をみてみると前手順で作成した tmp_app が作成されているから,確かに Deployment Server とClient間で設定ファイルが同期されていることがわかるよ.

ここまでの同様の手順を forwarder1, 2 両方に対して行ってね.

---- ここまでで*Forwarder*の初期設定は終わりだよ. ----


### Step.4 *Deployment Server*から*Forwarder*を一括設定

いよいよ*Forwarder*の設定を行うよ.
手順を1回実施するだけで 2つのForwarderに設定が反映されるよ.
今回はCentOSの/var/logディレクトリ配下をSplunkに送信するように設定するよ.

**1.splunk_dsに接続**

```
(host) $ docker exec -it -u splunk splunk_ds bash
```

**2.*Forwarder*の設定を作成**
*Forwarder*に送る設定ファイルは アプリ というまとまりで作っていくよ．
だからまずはアプリ用のディレクトリを作成して，その中に設定ファイルを作っていくよ．
この手順で使う2つの設定ファイルは[このページの一番下](#付録)に載せているよ.

```
(splunk_ds) $ mkdir -p /opt/splunk/etc/deployment-apps/forwarder_sample_app/local
(splunk_ds) $ cd /opt/splunk/etc/deployment-apps/forwarder_sample_app/local
(splunk_ds) $ vi inputs.conf 
(splunk_ds) $ vi outputs.conf
```

**3.作成したアプリをサーバークラスに追加**
アプリを作成したら，後はサーバークラスに設定して終わり！

   1. フォワーダー管理画面でアプリの編集画面を開く  
    http://localhost:8000/ja-JP/manager/system/deploymentserver?t=0
   1. サーバークラスを追加 を選択して「centos」を指定
   1. 同じページにある インストール後 欄の2つにチェックを入れて保存  
   ここのチェックを入れ忘れると思ったように動かないから注意してね．

これでサーバークラス*centos*に紐づいている*Forwarder*に対して作成した設定ファイルが配信されるよ.
設定ファイルを受け取ったクライアントは設定を適用するために自動的に再起動されるよ．

1つ注意点があって，アプリを初めて追加した時には自動的に配信されるんだけど
追加済みのアプリの中身を編集した時は*Deployment Server*を再起動しないと配信されないよ.
Splunk自体を再起動してもいいんだけど手間がかかるから下のコマンドがお勧めだよ.

```
$ splunk reload deploy-server  
```

アプリが配信されてから数分程度でCentOSの/var/logディレクトリ配下がSplunkに送信されるよ.

---- これで*Deployment Server*から*Forwarder*を一括設定は完了だよ. ----

### Step.5 Forwarderの動作確認

最後にForwarderから送信されたデータを確認するよ.  
サーチ画面の「データサマリ」を開くと
コンテナ forwarder1, 2 に設定したホスト名が表示されているよ．
それぞれをクリックすることでデータを詳しくサーチすることが出来るよ．

例えばクエリに source="/var/log/dnf.rpm.log Installed” と追加すれば
手順の中でインストールした wget や splunkforwarder のパッケージ名を確認できるね.

---- これでハンズオンは完了だよ． ----

## 終わりに
Splunkには,色々なマシンからデータを集める*Forwarder*っていう便利な機能があるんだけど時間が経つにつれて欲しいデータや追加する設定が増えていって管理が大変になるよ.

Forwarderとなるサーバに1度だけDeployment Serverを設定しておけばSplunkに仕事を任せられて楽ができるよ.

AnsibleやChefのようなサーバーの構成管理ツールを使えば同じようなことが出来るけど，Splunkを管理するならSplunkの機能を使う方が短時間でやりたいことが出来ると俺は思うよ.

## 後片付け
使い終わったコンテナは用が済んだら削除しておこう.

1.コンテナ停止

```
(host) $ docker stop splunk_ds
(host) $ docker stop forwarder1
(host) $ docker stop forwarder2
```

2.コンテナ削除

```
(host) $ docker rm splunk
(host) $ docker rm forwarder1
(host) $ docker rm forwarder2
```

## 付録
[Step.4-2 *Deployment Server*から*Forwarder*を一括設定](#step4-deployment-serverからforwarderを一括設定) で使用する設定ファイル

```:inputs.conf
[monitor:///var/log]
disabled=false
```

```:outputs.conf
[tcpout]
defaultGroup=forwarder-sample-group
[tcpout:forwarder-sample-group]
server=172.17.0.2:9997
[tcpout-server://172.17.0.2:9997]
```