よく使うSplunkのCLIまとめ

# はじめに
SplunkはブラウザやAPI経由でログのサーチや可視化ができますが、運用管理で役立つ **CLI** もたくさん用意されています。
全部を把握するのは難しいですが、よく使うもの・役立つものを自分の備忘録も兼ねていくつか紹介します。

# CLI実行方法
`$SPLUNK_HOME/bin/splunk` でCLI呼び出し
基本的な実行方法は↓

```bash
$SPLUNK_HOME/bin/splunk <commands>
```

どういうコマンドが使えるかは、下記で確認可能

```bash
$SPLUNK_HOME/bin/splunk help commands
```

### （参考）$SPLUNK_HOMEって？
`$SPLUNK_HOME` はSplunkがインストールされているディレクトリ
Linuxなら `/opt/splunk` （Universal Forwarderなら `/opt/splunkforwarder` ）、Windowsなら `C:\\Program Files\Splunk`

この環境変数はSplunkのマニュアルでも散見されますが、OSで決めているわけではなく、Splunkのプロセスで定義されています

# よく使うSplunk CLI
ということで、さっそく紹介してきます

## 起動 /停止 / 再起動
定番中の定番ですね

```bash
# Splunk起動
$SPLUNK_HOME/bin/splunk start
```

初期インストール時やアップグレード後の起動は↓ようにオプション指定すると便利

```bash
# Splunk起動（ライセンスに自動で同意）
$SPLUNK_HOME/bin/splunk start --accept-license --answer-yes --no-prompt
```

-- 2018/05/07 追記 ｺｺｶﾗ --
Splunkのバージョン **7.1.0** （2018年4月24日リリース）以降を使う場合は、 `--no-prompt` 使ってはいけないみたいです。
どうやら初回起動で **admin** ユーザーのパスワードを設定するみたいなので、 `--no-prompt` を指定するとパスワード設定の処理をスキップしてしまい、ユーザーが作成されていない状態のままログインできなくなるみたいです。（対処法あるにはあるのですが...）

なので、 **7.1.0** 以降を使う場合は初回起動を以下のように書き換えましょう。

```
sudo -u splunk /opt/$DIRECTORY/bin/splunk start --accept-license --answer-yes --seed-passwd changeme
```

この `--seed-passwd` は7.1.0の新しいオプションのようです。
-- 2018/05/07 追記 ｺｺﾏﾃﾞ --

```bash
# Splunk停止
$SPLUNK_HOME/bin/splunk stop
```

```bash
# Splunk再起動
$SPLUNK_HOME/bin/splunk restart
```

## Splunkの自動起動を設定
OS起動したタイミングで自動的にSplunkを起動させる設定
Windowsは自動的にオンになっているので、これはLinux向け

```bash
$SPLUNK_HOME/bin/splunk enable boot-start -user <user>
```

`-user` にはSplunkのプロセスを起動するOSユーザーを指定

※ これはOS設定 `/etc/init.d/splunk` を書き換えるので、sudoが必要になる場合もあります

## プロセス動いてるかチェック
Splunkが起動しているかのステータスをチェック

```bash
$SPLUNK_HOME/bin/splunk status
```

## Splunkの設定をチェック
どの設定が有効になっているかを確認
inputs.conf や indexes.conf といった設定ファイルはAppごとやSystemで複数作成できて、設定の重複もありえるのですが、どの設定が上書きされるかを確認するためのものになります。

```bash
$SPLUNK_HOME/bin/splunk btool <conf_file> list <option>
```

`<conf_file>` は例えば inputs.conf だったら `inputs` 、indexes.conf だったら `indexes` を指定
`<option>` に `--debug` を指定すると有効になっている設定のファイルパスが表示されます

注意事項として、設定変更後にSplunk再起動が必要な場合、再起動前でも `btool` ではその設定が有効になってしまっているように見えます。

## Splunkサーバー名、ホスト名を設定

```bash
# Splunkホスト名を設定
$SPLUNK_HOME/bin/splunk set default-hostname <hostname>
```

```bash
# Splunkサーバー名を設定
$SPLUNK_HOME/bin/splunk set servername <servername>
```

## ポート設定

```bash
# Webポート（デフォルト 8000）
$SPLUNK_HOME/bin/splunk set web-port <port>
```

```bash
# 管理ポート（デフォルト 8089）
$SPLUNK_HOME/bin/splunk set splunkd-port <port>
```

```bash
# KV Storeポート（デフォルト 8191）
$SPLUNK_HOME/bin/splunk set kvstore-port <port>
```

```bash
# Appサーバーポート（デフォルト 8065）
$SPLUNK_HOME/bin/splunk set appserver-ports <port>
```

実はSplunkはディレクトリを分ければ一つのサーバー・端末・VMに複数のSplunkをインストールすることができます。
その際、ポートを分ければ同時に複数のSplunkインスタンスを起動することができます。
ただし、この使い方はサポートされてないので、あくまで検証用として自己責任で。

## 最小の空きディスク容量を設定
Splunk稼働のために必要となる最小の空き容量を設定

```bash
# Splunkサーバー名を設定
$SPLUNK_HOME/bin/splunk set minfreemb <min_free_mb>
```

`<min_free_mb>` には最小空き容量をメガバイトで指定
デフォルトは `5000` （だったかな？）

ちょっとした検証用にEC2を8GBディスクで起動するとすぐ空容量足りなくなるので、これは個人的にはよく使います。

## インデックスの中のデータを削除
Splunkにインデックスされたデータを一括削除

```bash
$SPLUNK_HOME/bin/splunk clean eventdata -index <index>
```

`<index>` はインデックス名を指定
特定のインデックス内の **全ての** データを削除するので、他の条件（時間範囲等）は指定できません。
Splunk停止状態でのみ実行可能なので、必ず `splunk stop` の後に実行しましょう。

## Forwarderからのデータ受信設定
スタンドアロン環境や分散環境、クラスタ環境でIndexerがForwarderからデータを受け取る際にデータ受信用のポートを開ける必要があるので、それを設定

```bash
$SPLUNK_HOME/bin/splunk enable listen 9997
```

`9997` がポート番号
これ以外の数字でもいいけど、Splunk的には `9997` が一般的

## Deployment ServerにForwarderを登録

```bash
# Forwarderで設定
$SPLUNK_HOME/bin/splunk set deploy-poll <deploy_ip>:<deploy_port>
```

`<deploy_ip>:<deploy_port>` にはDeployment ServerのIPアドレス（もしくはホスト名やFQDN）とポートを指定
これはForwarder側で実行

## Deployment Serverを読み込み
Deployment ServerのWeb UIでForwarder管理の設定をした後、その設定を読み込ませる

```bash
$SPLUNK_HOME/bin/splunk reload deploy-server
```

これはDeployment Serverで実行

## SplunkプロセスからPython実行

```bash
$SPLUNK_HOME/bin/splunk cmd python <python_script>
```

例えば、Splunkの環境変数を取得するPythonスクリプトはこちら↓

```python:env_variables.py
import os

if __name__ == '__main__':
    for key in os.environ.keys():
    print key + ' = ' + os.environ[key]
```

標準出力に `$SPLUNK_HOME` といった環境変数が表示されます。

ちなみに、SplunkでPythonを実行する際は、OSに入っているPythonではなくSplunkにパッケージとして入っているPythonを実行します。
2018年3月時点での最新版　Splunk 7.0.xでは、Python 2.7が入っています。

## Appの一覧表示 / インストール / アンインストール

```bash
# App一覧表示
$SPLUNK_HOME/bin/splunk list app
```

```bash
# Appインストール
$SPLUNK_HOME/bin/splunk install app <app_file_path>
```

```bash
# Appアンインストール
$SPLUNK_HOME/bin/splunk remove app <app_name>
```

## ユーザーの一覧表示 / 追加 / 削除

```bash
# ユーザー一覧表示
$SPLUNK_HOME/bin/splunk list user
```

```bash
# ユーザー追加
$SPLUNK_HOME/bin/splunk add user <app_name> -role <role> -password <password>
```

```bash
# ユーザー削除
$SPLUNK_HOME/bin/splunk remove user <username>
```

# 最後に
今回は比較的使用頻度の高いものだけを書きました。
利用可能なCLIはもっとたくさあんあるので、今回はほんの氷山の一角なんです。

例えば、クラスター環境構築もほとんどCLIで実現できます。
それはまた別の機会に記事書きます。

-- 2018/05/07 追記 --
CLIを使ったクラスター環境構築の記事を書きました → [Splunkのクラスター環境を10分で構築してやるよ
](https://qiita.com/kikeyama/items/f9900059c5a00c22feda)