[Splunk]splunk-ansibleを検証する

# [Splunk]splunk-ansibleを検証する

## 目的・背景

GitHubで公開されている「[splunk-ansible](https://github.com/splunk/splunk-ansible)」を検証します


## 参考サイト

[splunk/splunk-ansible](https://github.com/splunk/splunk-ansible)  
[CentOSへPython、pipをインストール](https://qiita.com/yoshi0518/items/00e6a65535318c8a27df)  

## 環境

AWS EC2 RHEL8を利用しました。

## 必要パッケージのインストール
```
$ sudo yum update -y
```

### python3のインストール
```
$ sudo yum install -y https://repo.ius.io/ius-release-el7.rpm

$ sudo yum search python37
読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
 * base: d36uatko69830t.cloudfront.net
 * epel: d2lzkl7pfhq30w.cloudfront.net
 * extras: d36uatko69830t.cloudfront.net
 * updates: d36uatko69830t.cloudfront.net
警告: 一致するものが見つかりません: python37
No matches found

$ sudo yum search python36
読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
 * base: d36uatko69830t.cloudfront.net
 * epel: d2lzkl7pfhq30w.cloudfront.net
 * extras: d36uatko69830t.cloudfront.net
 * updates: d36uatko69830t.cloudfront.net
================================================= N/S matched: python36 ==================================================
python36-cairo-devel.x86_64 : Libraries and headers for python36-cairo
    :
wsgi-plugin-python36-tornado.x86_64 : uWSGI - Plugin for Tornado (Python 3.6) support
uwsgi-plugin-python36u.x86_64 : uWSGI - Plugin for Python support

  Name and summary matches only, use "search all" for everything.


$ sudo yum install -y python36u python36u-libs python36u-devel python36u-pip

$ sudo python3.6 -m pip install --upgrade pip

$ python3.6 --version
Python 3.6.8
$ python3 --version
Python 3.6.8

$ python3.6 -m pip --version
pip 20.2.3 from /usr/local/lib/python3.6/site-packages/pip (python 3.6)
$ python3 -m pip --version
pip 20.2.3 from /usr/local/lib/python3.6/site-packages/pip (python 3.6)

$ pip install requests
```

## dockerのインストール
```
$ sudo yum install -y yum-utils device-mapper-persistent-data lvm2
$ sudo yum install docker
$ docker --version
Docker version 1.13.1, build 64e9980/1.13.1

$ sudo systemctl start docker
$ sudo systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
   Active: active (running) since 火 2020-09-29 06:07:09 UTC; 1min 10s ago
     Docs: http://docs.docker.com
```

## docker-composeのインストール
```
$ sudo curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
$ docker-compose --version
docker-compose version 1.22.0, build f46880fe
```

## ユーザ・グループの作成

```
$ sudo groupadd splunk
$ sudo groupadd ansible

$ cat /etc/group | grep splunk
splunk:x:1001:
$ cat /etc/group | grep ansible
ansible:x:1002:

$ sudo useradd splunk -m -g 1001
$ sudo useradd ansible -m -g 1002

$ sudo passwd splunk
ユーザー splunk のパスワードを変更。
新しいパスワード: 
よくないパスワード: このパスワードは辞書チェックに失敗しました。 - 辞書の単語に基づいています
新しいパスワードを再入力してください: 
passwd: すべての認証トークンが正しく更新できました。

$ sudo passwd ansible
ユーザー ansible のパスワードを変更。
新しいパスワード: 
よくないパスワード: このパスワードは辞書チェックに失敗しました。 - 辞書の単語に基づいています
新しいパスワードを再入力してください: 
passwd: すべての認証トークンが正しく更新できました。

$ sudo usermod -aG wheel ansible
$ sudo usermod -aG wheel splunk

$ su - ansible
パスワード: 
最後の失敗ログイン: 2020/09/29 (火) 05:25:57 UTC日時 pts/0
最後の正しいログインの後に 1 回の失敗ログインの試行があります

$ groups
ansible wheel

$ sudo su -

We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

    #1) Respect the privacy of others.
    #2) Think before you type.
    #3) With great power comes great responsibility.

[sudo] password for ansible: P@ssw0rd
Last login: Tue Sep 29 04:51:58 UTC 2020 from softbank126150083139.bbtec.net on pts/0
# whoami
root

# exit
$ exit

$ sudo groupadd docker
$ sudo gpasswd -a splunk docker
# sudo gpasswd -a ansible docker
$ sudo systemctl restart docker
```

## splunkコンテナイメージの取得と起動

### splunkユーザに切り替え
```
$ sudo su - splunk
```

### splunkイメージの取得
```
$ docker pull splunk/splunk
Using default tag: latest
Trying to pull repository docker.io/splunk/splunk ...
latest: Pulling from docker.io/splunk/splunk
e96e3a1df3b2: Pull complete
    :
```

### splunkコンテナの起動
```
$ docker run -d --name splcontainer -p 8000:8000 splunk/splunk:latest no-provision

$ docker ps
CONTAINER ID        IMAGE                  COMMAND                  CREATED             STATUS                            PORTS                                                                           NAMES
1c341d8d176f        splunk/splunk:latest   "/sbin/entrypoint...."   8 seconds ago       Up 7 seconds (health: starting)   8065/tcp, 8088-8089/tcp, 8191/tcp, 9887/tcp, 0.0.0.0:8000->8000/tcp, 9997/tcp   splcontainer
```

## インストール媒体の取得

```
Splunk Enterpriseの媒体を取得
$ sudo wget -O splunk-8.0.6-152fb4b2bb96-Linux-x86_64.tgz 'https://www.splunk.com/bin/splunk/DownloadActivityServlet?architecture=x86_64&platform=linux&version=8.0.6&product=splunk&filename=splunk-8.0.6-152fb4b2bb96-Linux-x86_64.tgz&wget=true'

Splunk UNIVERSAL Forwarderの媒体を取得
$ sudo wget -O splunkforwarder-8.0.6-152fb4b2bb96-Linux-x86_64.tgz 'https://www.splunk.com/bin/splunk/DownloadActivityServlet?architecture=x86_64&platform=linux&version=8.0.6&product=universalforwarder&filename=splunkforwarder-8.0.6-152fb4b2bb96-Linux-x86_64.tgz&wget=true'
```


## デフォルトパラメータの取得
```
コンテナ内にあるパラメータファイルをローカルにコピー
$ docker run -it splunk/splunk:latest create-defaults > default.yml
$ ll
合計 4
-rw-rw-r--. 1 centos centos 3467  9月 29 06:12 default.yml
```

## パラメータファイルの設定

[このサイト](https://splunk.github.io/splunk-ansible/advanced/default.yml.spec.html#spec)を参照し、必要なパラメータを設定

splunkセクションに以下を追加

```
splunk:
  role: splunk_universal_forwarder
  build_location: /opt/ansible/splunkforwarder-8.0.6-152fb4b2bb96-Linux-x86_64.tgz
  apps_location: null
  password: changeme
```
    roleには以下が設定可
        splunk_standalone
        splunk_search_head
        splunk_search_head_captain
        splunk_indexer
        splunk_deployer
        splunk_cluster_master
        splunk_deployment_server
        splunk_heavy_forwarder
        splunk_license_master
        splunk_universal_forwarder
        splunk_monitor


* パラメータファイル内のパスに注意  
UniversalForwarderだと「/opt/splunkforwarder/〜」に変更する  
変更しないとUniversalForwarderが解凍された「/opt/splunkforwarder/」ではなく、「/opt/splunk/」を参照し処理が実行されるためインストール処理がエラーで中断してしまう  



## 設定後のパラメータファイルとインストール媒体をコンテナ内に配置
```
$ docker cp ./default.yml splcontainer:/opt/ansible/
$ docker cp ./splunk-8.0.6-152fb4b2bb96-Linux-x86_64.tgz splcontainer:/opt/ansible/
$ docker cp ./splunkforwarder-8.0.6-152fb4b2bb96-Linux-x86_64.tgz splcontainer:/opt/ansible/
```

## (課題)プレイブックの実行
ansible-playbookコマンドはエラーなく終了するがコンテナ内にインストールされてしまいました。
インベントリファイルの修正でローカルまたは他サーバにインストールできそうですが未検証です。

```
$ docker exec -it splcontainer bash -c 'cd /opt/ansible; ansible-playbook --inventory localhost, --connection local site.yml --extra-vars "@default.yml"'
```

## (参考)コンテナ内のAnsibleをローカルにコピー
```
$ sudo docker cp splcontainer:/opt/ansible .
```

## (応急処置)コンテナではなくローカルで実行
上記のように、コンテナで実行するとコンテナ内に構築されてしまいました。  
公式のガイドにも説明がありましたが、コンテナ内からローカルにAnsible一式を取得し実行させてみました。

なお、既にローカルにSplunk関連サービスが起動中の場合、インストール時にエラーが発生します。 
そのため、起動中のSplunkサービスを停止してから実行する必要があります。

```
(例)Splunk Universal Forwarderがインストール済みの場合
$ cd /opt/splunkforwarder/bin
$ ./splunk stop
```

```
$ cd ansible
$ cp ../default.yml ./
$ cp ../splunk-8.0.6-152fb4b2bb96-Linux-x86_64.tgz ./
＄ cp ../splunkforwarder-8.0.6-152fb4b2bb96-Linux-x86_64.tgz ./
$ ansible-playbook --inventory localhost, --connection local site.yml --extra-vars "@default.yml"
```
* 実行後、インストールに使用したファイル(.tgz)は削除されます。  
再実行するときは再度媒体をコピーする必要がある

## おわりに

コンテナ内でAnsibleを実行させ、Splunkをインストールすることができませんでしたが、Ansibleを使いSplunkをインストールさせることはできました。
何をインストールするのか、インストール先はどこにするのかなどはパラメータファイルである「default.yml」に記載します。
インベントリファイル、パラメータファイルを用途ごとに用意すればAnsibleによる冪等性を保ったデプロイバリエーションが広がりそうです。