【Splunkラボ】デプロイメントサーバーを使ってForwarderへのApp/Add-on配布を自動化するための手順

こんばんは。torippy1024です。

今日は、Splunkの機能の一つであるDeployment Server(DS)について書きたいと思います。
Deployment Serverは、Forwarderに対し、App/Add-onを一斉配信するための機能です。
厳密には、対象はForwarderでなくても構いません。オンプレであればIndexerやSearch Headへの配信も可能です。

同等の機能は、他の構成管理ツールを使用しても実現できるものだったりするので、必須のコンポーネントというわけではありませんが、せっかくあるSplunkの機能なので、どのようなことができるのかを実機にて検証してみたいと思います。

また、Deployment ServerはGUIで操作することも可能ですが、今回はCLIによる操作を試してみます。

### 【1】構成図

![スクリーンショット 2024-12-01 0.31.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684500/ff5f76c2-e869-c932-8b73-c3d5eba5de6c.png)

構成図は上記の通りです。
あんまり複雑にしても仕方がないので、なるべく簡単な構成にしています。
余裕があれば、Forwarderを2台構成にしてみたり、Windowsを使用してみるなどして試してみてください。

ちなみに、通信要件としては、以下の通りです。
- Forwarder - Splunk Cloud間: 9997/tcp
- Deployment Server - Forwarder間: 8089/tcp

スペックについても、動かすだけなら大した要件は不要です。私の環境では、Forwarder/Deployment Server両方とも、t3.medium(2vCPU/4GBメモリ)+50GB SSDで検証できました。

### 【2】Deployment ServerによるApp/Add-on配布の流れ

![スクリーンショット 2024-12-01 0.43.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684500/2f376c96-43f7-364a-9aac-96f7f8d5467a.png)

Deployment ServerによるApp/Add-on配布の流れは以下の通りとなります。
(0)Deloyment Serverをサーバーとして設定し、各Forwarderに対してDeloyment Clientとしての設定をする。
(1)Deloyment Client(Forwarder)が定期的にDeloyment Serverへポーリングする。
(2)Deloyment Serverは、問い合わせがあったForwarderに対して配布すべきApp/Add-onの一覧とチェックサムを提示する。
(3)Forwarderは、自分の持つApp/Add-onの一覧とチェックサムを照合し、差異があった場合はDeloyment Serverが持つApp/Add-onをダウンロードして自分自身に保存する。

上記の流れとなるため、Deployment ServerはClientに向けて自分から通信をすることはありません。
従って、もし間にFWがあれば、通信方向はDeployment Client→Deployment Serverの一方向通信(8089ポート)のみ解放すればよいです。

もちろん、単純にDeployment Serverの特定のディレクトリ(/opt/splunk/etc/deployment-apps/)内の全てのApp/Add-onを、全てのForwarderにコピーするのではなく、特定のApp/Add-onだけを、特定のサーバーのみに配信することも可能です。(ServerClassと呼ばれるサーバーグループを作成し、そこに指定のApp/Add-onを登録することで実現できます)

App/Add-onを配布するためにDeployment Serverおよびクライアント(Forwarder)に設定するファイルと、配布元と配布先のパスは以下です。これだけは頭に入れておいてもらえればと思います。
(Linuxを使用しており、$SPLUNK_HOME=/opt/splunkとしています。またdeploymentclient.confは、system/local直下に配置するのではなく、App化して/opt/splunk/etc/apps/< appName >/配下に配置したほうが適切のような気もしますが、今回はそこまで触れません)

#### Deployment Serverの設定ファイル
```
/opt/splunk/etc/system/local/serverclass.conf 
```
公式ドキュメントの説明リンク：
https://docs.splunk.com/Documentation/Splunk/latest/Admin/Serverclassconf

#### Deployment ServerのApp/Add-on配布元パス
```
/opt/splunk/etc/deployment-apps/
```

#### Deployment Clientの設定ファイル
```
/opt/splunk/etc/system/local/deploymentclient.conf 
```
公式ドキュメントの説明リンク：
https://docs.splunk.com/Documentation/Splunk/latest/Admin/Deploymentclientconf

#### Forwarder(Deployment Client)のApp/Add-on配布先パス
```
/opt/splunk/etc/apps/
```

### 【3】Splunk Cloudトライアル環境の申し込みと設定

他の記事でも解説しているので、記載を省略します。
以下より申し込んでください
https://www.splunk.com/ja_jp/download/splunk-cloud.html

その後、以下の記事にある【3】Splunk Cloudトライアル環境の設定とまったく同じ作業を実施してください。App/Add-onをWeb上でインストールしたりダウンロードするだけなので、すぐに終わります。
https://qiita.com/torippy1024/items/1c125ab08967c11f1889#3splunk-cloud%E3%83%88%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%AB%E7%92%B0%E5%A2%83%E3%81%AE%E8%A8%AD%E5%AE%9A
今回、Windowsは使用しないので、 Window Add-onはインストール不要ですが、別にインストールしても構いません。よくわからなかったら何も変えずに作業してしまってよいです。

### 【4】Forwarderの初期設定
次に、Forwarderを構築します。
以下の記事にある【4】中継Forwarderの設定とほぼ同じ作業ですが、少し差分があるので全手順を以下に記載します。リンク先は参考程度に見てください。
https://qiita.com/torippy1024/items/1c125ab08967c11f1889#4%E4%B8%AD%E7%B6%99forwarder%E3%81%AE%E8%A8%AD%E5%AE%9A

前の記事の作業との差分としては、(2)ログ取得のために必要なApp/Add-onのインストールを実施しないことと、ログ対象サーバーからのリスニングポートを解放しないこと(splunk enable listen 9997を実行しないこと)です。

(2)を実行しない理由は、今回、Deployment Serverを用いてForwarderにUnix and Linux Add-onをインストールするのためです。
リスニングポートを解放しない理由は、中継Forwarderとして使用しないためです。

```
ssh torippy1024@xxx.xxx.xxx.xxx
sudo mkdir /opt/splunkforwarder
sudo useradd -m splunkfwd
sudo passwd splunkfwd
(パスワードを入力)
wget -O splunkforwarder-9.3.0-51ccf43db5bd-Linux-x86_64.tgz "https://download.splunk.com/products/universalforwarder/releases/9.3.0/linux/splunkforwarder-9.3.0-51ccf43db5bd-Linux-x86_64.tgz"
sudo tar -xzvC /opt -f splunkforwarder-9.3.0-51ccf43db5bd-Linux-x86_64.tgz
sudo /opt/splunkforwarder/bin/splunk start --accept-license --answer-yes --seed-passwd password
sudo /opt/splunkforwarder/bin/splunk stop
sudo chmod -R 755 /opt/splunkforwarder
sudo chown -R splunkfwd:splunkfwd /opt/splunkforwarder
sudo /opt/splunkforwarder/bin/splunk enable boot-start -user splunkfwd
sudo /opt/splunkforwarder/bin/splunk start
```

クレデンシャルの転送(別ターミナルを開いてローカルPC上で実行)
```
scp -r /Users/torippy1024/splunkclouduf.spl torippy1024@xx.xx.xx.xx:/home/torippy1024/splunkclouduf.spl
```

クレデンシャルファイルの展開とインストール
```
ssh torippy1024@xxx.xxx.xxx.xxx
tar xvf splunkclouduf.spl
ls -la
(「100_prd-p-abcde_splunkcloud」のようなファイルが生成されていることを確認)
sudo chown -R splunkfwd:splunkfwd 100_prd-p-abcde_splunkcloud
sudo chmod -R 755 100_prd-p-abcde_splunkcloud
sudo /opt/splunkforwarder/bin/splunk install app 100_prd-p-abcde_splunkcloud -auth admin:password
sudo /opt/splunkforwarder/bin/splunk restart
sudo /opt/splunkforwarder/bin/splunk list forward-server
(Splunk CloudのURLがActive Forwardsに登録されていることを確認)
```

oneshotコマンドによる確認
```
echo "Error-Test-Forwarder" > error-test-forwarder.txt
sudo /opt/splunkforwarder/bin/splunk add oneshot error-test-forwarder.txt -auth admin:password
```
上記のコマンドが正常に終了していれば、Splunk Cloud上で、mainインデックスに「Error-Test-Forwarder」というイベントが登録されています。

### 【5】Deployment Serverの初期設定
次に、Deployment Serverを構築します。
こちらはちょっと手順が異なることに注意が必要です。
Forwarderにインストールする時は、Universal Forwarderファイルを使用しますが、Deployment Serverは、Splunk Enterpriseファイルを使用してインストールを行い、その後、ロール(使える機能)を制限することによってDeployment Serverとして使用します。
```
ssh torippy1024@xxx.xxx.xxx.xxx
sudo mkdir /opt/splunk
sudo useradd -m splunk
sudo passwd splunk
(パスワードを入力)
wget -O splunk-9.3.0-51ccf43db5bd-Linux-x86_64.tgz "https://download.splunk.com/products/splunk/releases/9.3.0/linux/splunk-9.3.0-51ccf43db5bd-Linux-x86_64.tgz"
sudo tar -xzvC /opt -f splunk-9.3.0-51ccf43db5bd-Linux-x86_64.tgz 
sudo /opt/splunk/bin/splunk start --accept-license --answer-yes --seed-passwd password
sudo /opt/splunk/bin/splunk stop
sudo chmod -R 755 /opt/splunk
sudo chown -R splunk:splunk /opt/splunk
sudo /opt/splunk/bin/splunk enable boot-start -user splunk
sudo /opt/splunk/bin/splunk start
```

インストールが完了したら、Deployment Serverが利用可能になります。
今回の上記の環境は、Splunk Enterpriseの初期インストールを終えた状態ですので、トライアルライセンスが適用されたSplunk EnterpriseのAll in oneインスタンスが稼働している状態です。
(たとえば、https://yyy.yyy.yyy.yyy.:8000 でブラウザからDeployment Server上のSplunk Enterprise機能を利用することも可能です)

実際に本番環境で運用を行う場合は、ロールを変更して、使用する機能をDeployment Serverに絞るなどの作業を行う必要がありますが、今回はそういった設定変更は実施しません。

### 【6】Deployment Serverの設定

次に、初期構築だけが終わったDeployment Server(Splunk Enterpriseインスタンス)に対し、Deployment Serverとしての機能を有効化するための設定を行います。
と言っても、大したことはないです。serverclass.confの内容を記載して再読み込みし、配布用のUnix and Linu Add-onを配置元ディレクトリに配置すればOKです。

```
ssh torippy1024@xxx.xxx.xxx.xxx
sudo cp -R /opt/splunk/etc/system/default/serverclass.conf /opt/splunk/etc/system/local/serverclass.conf
sudo chown -R splunk:splunk /opt/splunk/etc/system/local/serverclass.conf
sudo chmod -R 755 /opt/splunk/etc/system/local/serverclass.conf
sudo vi /opt/splunk/etc/system/local/serverclass.conf 
```

serverclass.confには、末尾に以下を記載してください。「xxx.xxx.xxx.xxx」が、ForwarderのIPアドレス(通常は内部IPアドレス)です。
```
~(末尾に以下を追記)~
[serverClass:nix_fwd]
whitelist.0=xxx.xxx.xxx.xxx

[serverClass:nix_fwd:app:Splunk_TA_nix]
stateOnClient = enabled
restartSplunkd = true
```
上記は、サーバークラス「nix_fwd」について、所属するサーバーをホワイトリスト形式でxxx.xxx.xxx.xxxとして単独で指定し、配布App「Splunk_TA_nix」について、配布後に有効化(stateOnClient = enabled)およびsplunkd再起動(restartSplunkd = true)を実施せよ、ということを示しています。

作業後は、権限を変更した後、splunkを再起動します。これでDeployment Server機能が有効化されます。
```
sudo cat splunk:splunk /opt/splunk/etc/system/local/serverclass.conf 
sudo /opt/splunk/bin/splunk restart
```

Unix and Linu Add-onの転送(別ターミナルを開いてローカルPC上で実行)
```
scp -r /Users/torippy1024/splunk-add-on-for-unix-and-linux_920.tgz ssh torippy1024@xxx.xxx.xxx.xxx:/home/torippy1024/
```

Unix and Linu Add-onを解凍してコピー(再度Deployment Serverにログインしている端末上で実行)
```
sudo tar -xzvC /opt/splunk/etc/deployment-apps/ -f splunk-add-on-for-unix-and-linux_920.tgz
sudo chown -R splunk:splunk /opt/splunk/etc/deployment-apps/Splunk_TA_nix
sudo chmod -R 755 /opt/splunk/etc/deployment-apps/Splunk_TA_nix
sudo ls -la /opt/splunk/etc/deployment-apps/
(Splunk_TA_nixが作成され、splunkがオーナーとなり権限755が設定されていることを確認)
```

ついでに、というわけではないのですが、Splunk_TA_nixをただ転送しただけでは意味が分かりづらいため、Splunk_TA_nix内部のinputs.confを修正しておき、Splunk_TA_nixが有効になったらこのAdd-onのinputs.conf経由でログが転送されるようにしておきます。
```
sudo mkdir /opt/splunk/etc/deployment-apps/Splunk_TA_nix/local
sudo cp -R /opt/splunk/etc/deployment-apps/Splunk_TA_nix/default/inputs.conf /opt/splunk/etc/deployment-apps/Splunk_TA_nix/local/inputs.conf
sudo chown -R splunk:splunk /opt/splunk/etc/deployment-apps/Splunk_TA_nix/local
sudo chmod -R 755 /opt/splunk/etc/deployment-apps/Splunk_TA_nix/local
sudo vi /opt/splunk/etc/deployment-apps/Splunk_TA_nix/local/inputs.conf
```

inputs.confで有効にする箇所の例は以下の通りです。
ぶっちゃけなんでもいいのですが、とりあえず私と全く同じ作業をしたい場合は以下のように、top.shによるインプットを有効化(disabled = 0に)してみてください。先頭ではなく、ちょっと進んだところにあります。
```
~(省略)~
[script://./bin/top.sh]
interval = 60
sourcetype = top
source = top
disabled = 0
~(省略)~
```

### 【7】Forwarder(Deployment Client)の設定

最後に、ForwarderをDeployment Clientとして構成すれば設定完了です。
と言っても、こちらもDeployment Serverの内部IPアドレスを指定して再起動するだけです。
```
ssh torippy1024@xxx.xxx.xxx.xxx
sudo /opt/splunkforwarder/bin/splunk set deploy-poll yyy.yyy.yyy.yyy:8089
sudo /opt/splunkforwarder/bin/splunk restart
sudo cat /opt/splunkforwarder/etc/system/local/deploymentclient.conf
(targetUri=yyy.yyy.yyy.yyy:8089が表示されることを確認)
```

### 【8】動作確認/参考情報

Forwarderの再起動が終わったら、1分待機した後、Forwarderのファイルパスを見てみます。
(ForwarderのがDeployment Serverに問い合わせする間隔がデフォルト60秒なので、1分待って確認します)
```
ssh torippy1024@xxx.xxx.xxx.xxx
sudo ls -la /opt/splunkforwarder/etc/apps/
(Splunk_TA_nixが転送されていることを確認)
```

Splunk Cloud上でも、サーチを実行してみます。
Splunk_TA_nixによって実行されたtopログが転送されるようになっていることがわかります。

```
index=main source=top
```

![スクリーンショット 2024-12-01 2.34.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684500/d01bb89e-7075-286e-44f3-510e66db8ef0.png)

ただ、私の場合は、Splunk_TA_nixが転送されていることは確認できたのですが、サーチは最初うまくいきませんでした。
Forwarderのsplunkを再起動したらうまくいったので、App/Add-on配信後の再起動に時間がかかったか、sudoを使ってrootでsplunkを起動させてしまっていたためにApp/Add-on配信後の再起動が失敗していたかのどちらかではないかと推測しています。

うまくいかない場合は、ForwarderまたはDeployment Serverのsplunkを再起動するとうまくいくかもしれません。


また、Deployment Serverに関する公式ドキュメントには以下があります。

- About deployment server and forwarder management
https://docs.splunk.com/Documentation/Splunk/latest/Updating/Aboutdeploymentserver

- Set up a deployment server and create a server class
https://docs.splunk.com/Documentation/MSApp/2.0.4/MSInfra/Setupadeploymentserver
(Deployment Serverのドキュメントではなく、特定のApp、しかもサポートが終了したLegacy Appのドキュメントに参考としてDeployment Serverの設定手順が載っています。本来参照の必要性は薄いのですが、Windows上でDeployment Serverを動作させたり、GUIにてApp/Add-onの設定を行うための簡単な手順が書かれているため、レガシードキュメントであることを踏まえた上で、参考として使用するのは良いと思います)

以上です。