SplunkからAnsible Tower/AWXのTemplate (Job / Workflow) を起動する

## はじめに

あるアラートが発生したときに自動でアクションを行いたい、という要件はよくあります。

例えば、ディスク容量不足を予測して事前に容量拡張したり不要ファイルを削除する、メモリ逼迫時にプロセス再起動するなどです。


Splunk自身には自動でアクションを取るための機能はありませんが、自動化の一つの方法としてAnsible Tower/AWSとインテグレーションすることで実現できます。

ということで「やってみた」の記事です。


## Ansible Tower/AWX Alert Action

このようなAdd-onがありAlert ActionからAnsible Tower/AWXのTemplateをキックできます。
使わせていただきましょう。
注意なのはSplunk Enterpriseのみ対応というところです。
（Splunk Cloud利用の場合は後述）

https://splunkbase.splunk.com/app/6527

内部的には[Ansible Tower API](https://docs.ansible.com/ansible-tower/latest/html/towerapi/api_ref.html#)の`/api/v2/job_templates/{id}/launch/`と`/api/v2/workflow_job_templates/{id}/launch/`を使っているようです。


## セットアップ

### Ansible AWXの準備

今回用に立ててみました。
基本的にこの手順に従えばKubernetesにデプロイできます（Kubernetesがお勧めだそうです）。

https://ansible.readthedocs.io/projects/awx-operator/en/latest/installation/basic-install.html

この手順を解説されている記事もありました。

https://zenn.dev/daiya/articles/185a35708555ce


なんやかんやあって立ち上がりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1218403/2bb64811-55ab-0a4b-a2a4-3d349b4f6c16.png)


### AWXテンプレート

最初から入っているDemo Job Templateを使わせていただきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1218403/fdcb71c8-79e8-e355-0879-3e23d82397b2.png)

重要なのはテンプレートのIDでURLから確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1218403/8ae1763a-1d69-e964-f2b4-2a302364dde0.png)


### Ansible Tower/AWX Alert Action

Splunk EnterpriseにAdd-onをインストールした後に設定をします。

[設定 > Add-on Settings]からAWXホストの情報をいれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1218403/10713bc4-aa8a-6658-dadc-c966a1411e8c.png)

[入力 > Create New Input]から、`Parse Ansible Queue`と`Parse Ansible Results Queue`を適当に作ります。
これは実行時と結果のQueue情報を任意のIndexに格納するものです。
Template実行結果を確認するための重要な情報です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1218403/e0b80a9f-9ad0-dbad-ee00-b1770e3d5867.png)

### Alert Action設定

アクションを起こしたいSPLを書いてアラートを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1218403/3f8feade-2aaf-a041-e7b5-7f740ab3b716.png)

アクションに「Execute Ansible Playbook」が追加されていますので情報を埋めます。
結果を変数で渡すこともできます。Template側でextra_varsが必要な場合はこのように渡しましょう。
（今回はTemplate側でextra_varsは不要なので弾かれるだけですが）
変数についての詳細は[こちら](https://docs.splunk.com/Documentation/Splunk/latest/Alert/EmailNotificationTokens)。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1218403/82898a23-2498-cfc4-2899-6949e0cd8f3f.png)

#### 結果の確認

アラートが実行されるまでしばし待つと、無事AWX側でジョブが実行されました。やったね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1218403/8df40c72-1630-336a-a812-74e8b9fee618.png)


Splunk側でも「入力」で定義したIndexにQueue情報が出力されています。
これで成功したかどうかが分かります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1218403/2f2a3ea3-a34a-6b01-3e7d-b2bbb7d4bd15.png)



#### 拡張性について

今回はIDを決め打ちにしちゃいましたが、アラートメッセージとIDやParmの組み合わせをLookupにして、変数で渡すようにするとアラートをいくつも作らなくてすむかと思います。


### Splunk Cloud使っているんだけど？

その場合はSplunk Enterpriseは個別に立ててSplunk EnterpriseからSplunk CloudへのFederated Searchを行う方法が考えられます。

Federated Searchのセットアップ手順はこちら。
https://docs.splunk.com/Documentation/Splunk/latest/FederatedSearch/fss2sAbout

ざっくり説明すると、
Splunk Cloud側：ロールとユーザーを作成。
Splunk Enterprise側：設定 > 統合サーチからSplunk Cloudの情報を入力。Standard modeの場合は取得対象のindexを指定。

これによりSplunk Enterprise上のSPLでSplunk CloudのIndexのデータをクエリし、Ansibleアラートアクションを実行することができます。


### Splunk Observability Cloud使っているんだけど？

Splunk Infrastructure Monitoring Add-onを使うことでSplunk Observability Cloud上のアラートやメトリクスを拾うことができるので何とかなるでしょう。
https://splunkbase.splunk.com/app/5247



## まとめ

Ansible Tower/AWXを使っている場合にSplunkからキックするAdd-onを試してみました。

Happy Automating!