Rundeck使ったOCIリソース Job管理(Rundeck運用編)

## 概要
Job管理ツールのRundeckをOCIに導入しました。
Rundeck準備編、Job実行編とRundeck運用編と3つのパートに分けています。

[Rundeck準備編](https://qiita.com/tktk2712/items/bae4a9a17afcd505af8c)
[Job実行編](https://qiita.com/tktk2712/items/e97ad777704e493dd4cb)
[Rundeck運用編←今ココ](https://qiita.com/tktk2712/items/f193437887ebd1b30ad1)

## 構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730992/3ec8a561-363b-c2da-f144-4e1c23daa1ec.png)

## 死活監視
OCIモニタリング機能を使用してRundeckサーバーの死活監視を行います。
作成方法については以下を参考にしてください

参考
[モニタリング機能でOCIのリソースを監視する](https://oracle-japan.github.io/ocitutorials/intermediates/monitoring-resources/)
[OCIモニタリング　グルーピングを使用したメトリッククエリーサンプル](https://qiita.com/tktk2712/items/04cc356c23b7161fc372)

## サービス監視
Rundeckのサービスポートtcp/4440の監視をモニタリング機能のカスタムメトリックを使用して行います。
CPU使用率等の標準メトリック以外の監視はカスタムメトリックを使用することによって可能になります。
今回はtcp/4440へのhtml監視を行いReturn code(例えば200)をカスタムメトリックとしてOCIに送信して200以外になった場合アラーム発生させます。

* 動的グループ作成

OCIコンソールのナビゲーションメニューからアイデンティティとセキュリティ>>ドメイン(Default)>>動的グループを選択して「動的グループの作成」を押下
名前：任意の名前を設定
一致ルール：
今回は特定のコンパートメントを動的グループとして指定

"下で定義したいずれかのルールに一致"を選択してルールを記述
_instance.compartment.id = '【コンパートメントOCID ocid1.compartment.oc1..&#42;&#42;】'_
_resource.compartment.id = '【コンパートメントOCID ocid1.compartment.oc1..&#42;&#42;】'_

参考
[動的グループを定義するための一致ルールの記述](https://docs.oracle.com/ja-jp/iaas/Content/Identity/dynamicgroups/Writing_Matching_Rules_to_Define_Dynamic_Groups.htm)

* ポリシー作成

OCIコンソールのナビゲーションメニューからアイデンティティとセキュリティ>>ポリシーを選択して「ポリシーの作成」を押下
_Allow dynamic-group 【動的グループ】 to use metrics in compartment 【コンパートメント】 where target.metrics.namespace='custom_metrics'_

参考
[Oracle Cloud Infrastructureドキュメント 共通ポリシー ユーザーによるカスタム・メトリックの公開](https://docs.public.oneportal.content.oci.oraclecloud.com/ja-jp/iaas/Content/Identity/policiescommon/commonpolicies.htm)

* Python作成
```http4440check.py
import oci,psutil,datetime
from pytz import timezone
import subprocess

# initialize service client with InstancePrincipals
signer = oci.auth.signers.InstancePrincipalsSecurityTokenSigner()
monitoring_client = oci.monitoring.MonitoringClient(config={},signer=signer,service_endpoint="https://telemetry-ingestion.【Region】.oraclecloud.com")

times_stamp = datetime.datetime.now(timezone('UTC'))

# curl localhost:4440
res = subprocess.run(["curl","http://localhost:4440/user/login","-o","/dev/null","-w","%{http_code}","-s"],stdout=subprocess.PIPE)

returncode = int(res.stdout)

# custom metric
post_metric_data_response = monitoring_client.post_metric_data(
post_metric_data_details=oci.monitoring.models.PostMetricDataDetails(
metric_data=[
    oci.monitoring.models.MetricDataDetails(
        namespace="custom_metrics",
        compartment_id="【コンパートメントOCID ocid1.compartment.oc1..**】",
        name="http_result",
        dimensions={'server_id': "Linux-Rundeck_4440"},
        datapoints=[
            oci.monitoring.models.Datapoint(
                timestamp=datetime.datetime.strftime(
                    times_stamp,"%Y-%m-%dT%H:%M:%S.%fZ"),
                value=returncode)]
        )]
    )
)
```
cronにて5分毎に実行
```
*/5 * * * * python /path/to/http4440check.py
```
* アラーム作成

OCIコンソールのナビゲーションメニューから監視および管理>>メトリック・エクスプローラを選択
問合せに以下を設定
　　+ メトリック・ネームスペース：custom_metrics
　　+ メトリック名：http_result
　　+ ディメンション名: server_id
　　+ ディメンション値: Linux-Rundeck_4440
「チャートの更新」を押下してメトリックが取得できることを確認
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730992/0e9744fa-51cd-b4bd-e825-bf162a7e4e88.png">

「アラームの作成」を押下してアラームを作成
作成方法については以下を参照
[モニタリング機能でOCIのリソースを監視する](https://oracle-japan.github.io/ocitutorials/intermediates/monitoring-resources/)

各パラメータについて以下のように設定
　　+ メトリック・ネームスペース：custom_metrics
　　+ メトリック名：http_result
　　+ 間隔:5分
　　+ 統計：Mean
　　+ ディメンション名: server_id
　　+ ディメンション値: Linux-Rundeck_4440
　　+ トリガー・ルール: 演算子=範囲外、値＝200、トリガー遅延分数＝1

## Disk backup
VMのブートボリュームを定期バックアップします
作成方法については以下を参考にしてください
[ブロック・ボリュームをバックアップする](https://oracle-japan.github.io/ocitutorials/intermediates/taking-block-volume-backups/)

## Rundeckログアーカイブ
RundeckのアクティビティログをObject Storageに保管します。
また30日を超えるログは削除します。
VMからObjectStorageへのアクセスはユーザー認証ではなくVMに権限を付与するインスタンス・プリンシパルを利用します。
* 動的グループ作成

OCIコンソールのナビゲーションメニューからアイデンティティとセキュリティ>>ドメイン(Default)>>動的グループを選択して「動的グループの作成」を押下
名前：任意の名前を設定
一致ルール：
今回は特定のコンパートメントを動的グループとして指定

下で定義したいずれかのルールに一致
_instance.compartment.id = '【コンパートメントOCID ocid1.compartment.oc1..&#42;&#42;】'_
_resource.compartment.id = '【コンパートメントOCID ocid1.compartment.oc1..&#42;&#42;】'_

参考
[動的グループを定義するための一致ルールの記述](https://docs.oracle.com/ja-jp/iaas/Content/Identity/dynamicgroups/Writing_Matching_Rules_to_Define_Dynamic_Groups.htm)

* ポリシー作成

OCIコンソールのナビゲーションメニューからアイデンティティとセキュリティ>>ポリシーを選択して「ポリシーの作成」を押下
_Allow dynamic-group 【動的グループ】 to read buckets in compartment 【コンパートメント】_
_Allow dynamic-group 【動的グループ】 to manage objects in compartment 【コンパートメント】 where all {target.bucket.name='【バケット名】', any {request.permission='OBJECT_CREATE', request.permission='OBJECT_INSPECT'}}_

参考：
[Oracle Cloud Infrastructureドキュメント 共通ポリシー  ユーザーによるオブジェクトのオブジェクト・ストレージ・バケットへの書込み](https://docs.public.oneportal.content.oci.oraclecloud.com/ja-jp/iaas/Content/Identity/policiescommon/commonpolicies.htm)

* バケット作成

OCIコンソールのナビゲーションメニューからストレージ>>バケットを選択して「バケットの作成」を押下
 *バケット名: 任意
 *デフォルト・ストレージ層
  <font color="#1e90ff">標準またはアーカイブを選択します。アーカイブは取り出しに時間がかかりますが保管料金が安いため長期保管に有効です。</font>
作成したバケットを選択して、他のアクションから新規フォルダの作成

* 書き込みテスト
/tmp/test.txtをバケットのフォルダrdbkに書き込みする場合
```
#オブジェクト・ストレージ・ネームスペース取得
[user@linux-rundeck]$ oci os ns get --auth instance_principal
{
  "data": "【ネームスペース】"
}
#ファイル書き込み
[user@linux-rundeck]$ oci os object put --auth instance_principal -ns 【ネームスペース】 -bn 【バケット名】 --file /tmp/test.txt --name rdbk/test.txt
```

* RundeckのアクティビティログをObject Storageに保管して30日を超えるログを削除するShell作成
```
#! /bin/bash
RD_TODAY=`date +%Y%m%d`
export RD_CONF=/path/to/rd.conf

# Get backup files from /var/lib/rundeck/logs
zip /tmp/rdbklog${RD_TODAY} -r /var/lib/rundeck/logs/rundeck/project1_oci/
rd executions query -p project1_oci > /tmp/rdbktbl${RD_TODAY}.txt

sleep 2

# Put backfiles on OCI object storage bucket
oci os object put --auth instance_principal -ns 【ネームスペース】 -bn 【バケット名】 --file /tmp/rdbktbl${RD_TODAY}.txt --name 【フォルダ名】/rdbktbl${RD_TODAY}.txt
oci os object put --auth instance_principal -ns 【ネームスペース】 -bn 【バケット名】 --file /tmp/rdbklog${RD_TODAY}.zip --name 【フォルダ名】/rdbklog${RD_TODAY}.zip

sleep 2

# Delete backup files
rm -f /tmp/rdbktbl${RD_TODAY}.txt
rm -f /tmp/rdbklog${RD_TODAY}.zip

sleep 2

# Delete old log files
rd executions deletebulk -y --older 30d -p project1_oci
```
* Rundeck Job登録

-Rundeckにlogin
-ジョブを選択し画面右上の「新しいジョブ」ボタンを押下
-タブDetailsのジョブ名を入力
-タブWorkflowのステップScript file or URLを選択してFile Path or URLに実行するShellを指定して保存
-タブScheduleで実行するスケジュールを設定
-「作成」ボタンを押下
-ジョブ画面で「今すぐジョブを実行」によりジョブを確認可能

* 実行結果
成功するとアクティビティ一覧とログがObjectstorageに保管されます。
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730992/31242cd9-d19f-08c4-184a-9611b00af87b.png">

[OCI技術資料 : オブジェクト・ストレージ 概要](https://speakerdeck.com/ocise/ociji-shu-zi-liao-obuziekutosutorezi-gai-yao?slide=5)によるとアーカイブストレージは1TBで約364円/月となっており非常に安価なのでセキュリティや監査を目的としたログ長期保管には有効かと思います。

Rundeck運用編はここまでです。