Rundeck使ったOCIリソース Job管理(Job実行編)

## 概要
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)

## VMからファイル取得してObjectStorage Bucketに保存

VMからファイル取得してObjectStorage Bucketに保存するJobを作成します。
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
```

* VMからファイル取得してObjectStorage Bucketに保存するShell作成
```
#! /bin/bash

# VMからファイル取得
# システムによって異なるため略

# ObjectStorage Bucketに保存
oci os object put --auth instance_principal -ns 【ネームスペース】 -bn 【バケット名】 --file 【取得したファイル】 --name 【保存先】
```

* Rundeck Job登録

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

## VM起動/停止
VM起動/停止を行うJobです。
OCI CLIの実行はユーザー認証ではなく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 use instances in compartment 【コンパートメント】_

参考
[Oracle Cloud Infrastructureドキュメント 共通ポリシー  ユーザーによるコンピュート・インスタンスの起動](https://docs.public.oneportal.content.oci.oraclecloud.com/ja-jp/iaas/Content/Identity/policiescommon/commonpolicies.htm)
[Oracle Cloud Infrastructureドキュメント コア・サービスの詳細](https://docs.oracle.com/ja-jp/iaas/Content/Identity/Reference/corepolicyreference.htm)

- 起動テスト

```
# VM起動ステータス(RUNNING,STOPED等)
[user@linux-rundeck]$ oci compute instance get --auth instance_principal --instance-id 【インスタンスOCID ocid1.instance.oc1.**】
# VM起動
[user@linux-rundeck]$ oci compute instance action --auth instance_principal --action start --instance-id 【インスタンスOCID ocid1.instance.oc1.**】
```
* VM起動/停止のShell作成
```
#! /bin/bash

# Get VM status
LSTATE=$(oci compute instance get --auth instance_principal --instance-id $1 | jq -r '.data | ."lifecycle-state"')
echo "Lifecycle-state is $LSTATE"

# Action start
if [ "$LSTATE" = "STOPPED" ] && [ "$2" = "start" ]; then
        oci compute instance action --auth instance_principal --action $2 --instance-id $1

# Action stop
elif [ "$LSTATE" = "RUNNING" ] && [ "$2" = "stop" ]; then
        oci compute instance action --auth instance_principal --action $2 --instance-id $1

else
        echo "Action aborted"
        exit
fi

# Get VM Status
echo "Wait 1 minute.."
sleep 1m
LSTATE2=$(oci compute instance get --auth instance_principal --instance-id $1 | jq -r '.data | ."lifecycle-state"')
echo ${LSTATE2}

```

* Rundeck Job登録

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

## Functions呼び出し
OCI Functionsを呼び出すことも可能です。
OCI CLIの実行はユーザー認証ではなく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 use functions-family in compartment 【コンパートメント】_

参考
[Oracle Cloud Infrastructureドキュメント ファンクションを呼び出して管理するためのアクセス権の制御](https://docs.public.oneportal.content.oci.oraclecloud.com/ja-jp/iaas/Content/Functions/Tasks/functionsrestrictinguseraccess.htm)
* Functionsを呼び出すShell作成
```
#! /bin/bash

# Functionsを呼び出すためのコマンド例
oci fn function invoke --auth instance_principal --function-id 【FunctionsのOCID ocid1.fnfunc.oc1.**】

```

* Rundeck Job登録

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

Job実行編はここまでです。
次はRundeck運用編にてRundeckサーバーの運用設定を行います。