[Splunk]Splunk-ansibleを検証する(他サーバ向け)

# Splunk-ansibleを検証する(他サーバ向け)

## 目的・背景

GitHubで公開されている「[splunk-ansible](https://github.com/splunk/splunk-ansible)」を検証し、自サーバに対してSplunk EnterpriseとSplunk Universal Forwarderの自動インストールおよびサービスの起動まで確認することができました。  

次は他サーバに対して同じ用に自動インストールが行えるかどうかを検証します。

## 考察

自動構築を行う際に実行したコマンドは以下になります

```
$ ansible-playbook --inventory localhost, --connection local site.yml --extra-vars "@default.yml"
```

インベントリに「localhost」、--connectionに「local」と指定されているのでここを他サーバのアドレスに変更すれば動きそうです。

## インベントリファイルの作成

新たに「hosts」というファイルを作成し、対象サーバの情報を記載しました。
なお、今回の環境はAWS EC2 のRHEL8を使用していますので、接続情報を「vars」に追記しています。

```
[UF]
xxx.xxx.xxx.xxx

[UF:vars]
ansible_ssh_user=ec2-user
ansible_ssh_private_key_file=xxxxxxxx.pem
```

## どうやってもローカルにインストールされてしまう

インベントリファイルの準備もできたので、早速実行してみました。
ところが何度実行してもローカル環境にインストールされてしまいます。

```
$ ansible-playbook --inventory hosts, site.yml --extra-vars "@default.yml"
```

## 各種ファイルの修正

調査した結果、インベントリファイルだけではなく、いくつかのファイルを設定しなければならないことが分かりました。

### site.yml

対象ホストに「localhost」と記載がありました。  
ここをインベントリファイルのグループに対応させる記述に変更します。  
今回はグループが「UF」しかないので「all」とします。  

(変更前)

```
---
- name: Run default Splunk provisioning
  hosts: localhost
```

(変更後)

```
---
- name: Run default Splunk provisioning
  hosts: all
```

### default.yml

パラメータファイル「default.yml」に「ansible_connection」の指定がありました。  
こちらをコメントにします。

(変更前)

```
---
ansible_connection: local
```

(変更後)

```
---
#ansible_connection: local
```

## 他サーバに向いたけど．．．

上記修正後に再度実行しましたが、さらなる問題が発生しました。  
(実行時ログを控えていないので文書のみの説明となります)  

* splunkユーザが存在しない
* インストール媒体が存在しない

まずは一度動かしてみたいので、少々力技ですが、予め相手サーバにsplunkユーザを作成、インストール媒体もscpで転送し実行してみたところ、無事に相手サーバにSplunk Universal Forwarderがインストールされました。  

では、上記2点にちゃんと対応してみます。

## 課題１：Splunkユーザが存在しない

こちらはパラメータファイルである「default.yml」にあるパラメータを変更することで解決しました。  
今回はsplunkユーザを事前に作成するのではなく、既存のユーザ(ec2-user)でインストールすることにしました。  

(変更前)

```
splunk:
  user: splunk
  group: splunk
```

(変更後)

```
splunk:
  user: ec2-user
  group: ec2-user
```

## 課題２：インストール媒体が存在しない


こちらもパラメータファイル「default.yml」に媒体の場所を記載しています。  

```
  build_location: /home/splunk/ansible/splunkforwarder-8.0.6-152fb4b2bb96-Linux-x86_64.tgz
```

このパスが相手サーバにないのでエラーになりました。  
この「build_location」には実際のパス以外にもURLを記載することができます。  
今回はAWS S3に媒体を保存し、そこから入手することとしました。

```
  build_location: https://xxxxxxxx.s3-ap-northeast-1.amazonaws.com/splunkforwarder-8.0.6-152fb4b2bb96-Linux-x86_64.tgz
```

## 無事に自動インストールが成功

ここまでの設定を検証するために、相手サーバに作成したsplunkユーザとインストール媒体を削除。  
以下のコマンドを実行することで、エラーなく無事に相手サーバに自動インストールが成功しました。

```
$ ansible-playbook --inventory hosts, site.yml --extra-vars "@default.yml"
```

## おわりに

今回はAWS EC2環境で2台のインスタンスを用意し、AnsibleによるSplunkの自動インストールを検証しました。  
インベントリファイル「hosts」の設定次第で複数台にインストールすることはできそうです。  
ただ、パラメータファイルである「default.yml」にはroleをひとつしか指定できないようです。

```
splunk:
  role: splunk_universal_forwarder
```

今回は未検証ですが、例えば、Splunk EnterpriseとSplunk Universal Forwarderをインストールする場合はsite.ymlとパラメータファイル「default.yml」をそれぞれ用意し、Ansibleのコマンドをそれぞれ実行しなければならないのではないかと推測しています。  

(hosts)

```
[UF]
xxx.xxx.xxx.xxx

[UF:vars]
ansible_ssh_user=ec2-user
ansible_ssh_private_key_file=xxxxxxxx.pem

[ENT]
xxx.xxx.xxx.xxx

[ENT:vars]
ansible_ssh_user=ec2-user
ansible_ssh_private_key_file=xxxxxxxx.pem

```

(site.yml.uf)

```
---
- name: Run default Splunk provisioning
  hosts: UF
```

(site.yml.ent)

```
---
- name: Run default Splunk provisioning
  hosts: ENT
```

(default.yml.uf)

```
splunk:
  role: splunk_universal_forwarder
```

(default.yml.ent)

```
splunk:
  role: splunk_standalone
```

```
$ ansible-playbook --inventory hosts, site.yml.uf --extra-vars "@default.yml.uf"
$ ansible-playbook --inventory hosts, site.yml.ent --extra-vars "@default.yml.ent"
```
もう少し別の方法があるのでは？とも感じますが、今回の検証は以上となります。