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)

## VM作成前準備
OCI公式ガイド等を参照しながら各リソースを準備します。
* VCN
* 管理対象VMやLoad balancerを設置するPublic subnet
* Rundeckを設置するPrivate subnet
* Public subnetにInternet Gatewayを追加
* Public subnetのRoute tableにデフォルトルートをInternet Gatewayに向くよう設定
* Public subnetのSecurity listに必要な通信許可を設定
* Private subnetにNAT Gatewayを追加
* Private subnetのRoute tableにデフォルトルートをNAT Gatewayに向くよう設定
* Private subnetのSecurity listに送信元IP 0.0.0.0/0, 宛先IP 0.0.0.0/0のOutbound通信を許可
* Private subnetのSecurity listに送信元IPをOpretator subnet, 宛先Port 4440のInbound通信を許可

## VM作成
[Instance System Requirements](https://docs.rundeck.com/docs/administration/install/system-requirements.html)を参考にしてVMを作成します
* OCIコンソールのナビゲーションメニューからコンピュート>>インスタンスを選択して「インスタンスの作成」を押下
* 名前を設定
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730992/e0ba82da-9783-b3b0-349b-e0d3398f5b65.png">

* OSイメージとシェイプを設定
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730992/fc7419ff-42dd-0de0-3ac7-b80989139666.png">

* Network設定
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730992/7169b47e-12d4-1213-c8b6-6127bd8779f4.png">

* SSHキー設定
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730992/d069b09b-cfd8-87c8-29ef-0c4abd8aaa4d.png">

* ブートボリューム設定
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730992/eb601d9f-d05c-7d6b-12f0-ef9aa01bb801.png">

* 「作成」を押下

## (オプション)プライベートDNSを使用したホスト名アクセス 
外部ネットワークからサーバーに名前でアクセスする場合はVCN内にリスニングのエンドポイントを作成します。作成後、外部ネットワークDNSからエンドポイントにフォワードすることによって名前解決が可能です。
[リゾルバ・エンドポイントの作成](https://docs.public.oneportal.content.oci.oraclecloud.com/ja-jp/iaas/Content/Network/Tasks/resolver-endpoint-create.htm)

## 時刻設定
時刻をJSTに変更して再起動します。
```
[user@linux-rundeck]$ sudo timedatectl set-timezone Asia/Tokyo
[user@linux-rundeck]$ sudo timedatectl
               Local time: Tue 2024-01-09 01:12:09 JST
           Universal time: Mon 2024-01-08 16:12:09 UTC
                 RTC time: Mon 2024-01-08 16:12:09
                Time zone: Asia/Tokyo (JST, +0900)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no
[user@linux-rundeck]$ sudo reboot
```
## OCI CLIインストールおよびPython確認
JobのShell実行用にOCI CLIをインストールしてPythonバージョンを確認します。
[Oracle Cloud Infrastructureドキュメント CLIのインストール](https://docs.oracle.com/ja-jp/iaas/Content/API/SDKDocs/cliinstall.htm#InstallingCLI__oraclelinux8)
```
# インストール後の確認
[user@linux-rundeck]$ oci -v
3.37.1
[user@linux-rundeck]$ python --version
Python 3.6.8
```

## Rundeck インストール
ガイドを参照してRundeckを導入します。
[Installing on Red Hat, Amazon or Oracle Linux distributions](https://docs.rundeck.com/docs/administration/install/linux-rpm.html)
導入後rundeckを起動できることを確認します。
* 導入後の確認
```
[root@linux-rundeck]# service rundeckd start
Starting rundeckd (via systemctl):                         [  OK  ]
[root@linux-rundeck]# service rundeckd status
● rundeckd.service - SYSV: rundeckd, providing rundeckd
   Loaded: loaded (/etc/rc.d/init.d/rundeckd; generated)
   Active: active (running) since Tue 2024-01-09 09:42:49 JST; 5s ago

[user@linux-rundeck opc]# netstat -an | grep 4440
tcp6       0      0 :::4440                 :::*                    LISTEN
```
* tcp/4440でlistenするためFirewallを許可
```
[root@linux-rundeck]# firewall-cmd --add-port=4440/tcp --zone=public --permanent
success
[root@linux-rundeck]# firewall-cmd --reload
success
[root@linux-rundeck]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens3
  sources:
  services: dhcpv6-client ssh
  ports: 4440/tcp
```

## Rundeckプロファイル設定
デフォルトではローカルアクセスのみのため、プロファイルを編集してサービス再起動してアクセスできることを確認します。
* プロファイル編集と再起動
```
[root@linux-rundeck]# vi /etc/rundeck/rundeck-config.properties
grails.serverURL=http://【IPアドレスまたはhost名】:4440

[root@linux-rundeck]# vi /etc/rundeck/framework.properties
framework.server.name = 【IPアドレスまたはhost名】
framework.server.hostname = 【IPアドレスまたはhost名】
framework.server.port = 4440
framework.server.url = http://【IPアドレスまたはhost名】:4440

[root@linux-rundeck]# service rundeckd restart
```
* アクセス確認
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730992/016e57f5-d81c-d450-2768-9c02f446bf51.png">

## (オプション)httpsオフロード
今回はRundeckへのWebアクセスは閉域網からのアクセスを想定しています。
しかし、http通信なのでusername/password等の通信内容は暗号化されていません。
セキュリティ上考慮が必要な場合はhttps通信に切り替えが可能です。
WAN通信を暗号化する場合はOCI Loadbalancerでhttpsオフロードすることによりrundeckの負担を軽減することが可能です。
* Loadbalancer設定
[OCI LoadBalancerを使ってNATとSSL/TLS終端を行う](https://qiita.com/tktk2712/items/b0f208deffb979fadb27)を参考にLoadbalancerを設定
* プロファイル編集と再起動
```
[root@linux-rundeck]# vi /etc/rundeck/rundeck-config.properties
grails.serverURL=https://【ドメイン名】:4430
server.useForwardHeaders=true

[root@linux-rundeck]# vi /etc/rundeck/framework.properties
framework.server.name = 【host名】
framework.server.hostname = 【host名】
framework.server.port = 4440
framework.server.url = http://【host名】:4440
framework.rundeck.url = https://【ドメイン名】:4430

[root@linux-rundeck]# service rundeckd restart
```

## (オプション)adminパスワード変更、ユーザー追加
adminの初期パスワードはadminなので必要に応じて
[Authenticating Users](https://docs.rundeck.com/docs/administration/security/authentication.html#propertyfileloginmodule)を参考にパスワードを変更します。
ユーザーを追加する場合は、上記に加えてaclpolicyファイルを[Access Control Policy](https://docs.rundeck.com/docs/administration/security/authorization.html)を参考に作成します。
```
[root@linux-rundeck]# vi /etc/rundeck/realm.properties
admin:【パスワード】,user,admin,architect,deploy,build

#ユーザーを追加する場合はユーザー名:パスワード,グループを追加
user1:【パスワード】,user

#user1が所属するグループuserのaclpolicyを作成
[root@linux-rundeck]# vi /etc/rundeck/user.aclpolicy

description: user
context:
  project: '【Project】' #後述するProjectと一致させる
for:
  resource:
    - allow: [read] # allow read all kinds
  adhoc:
    - allow: [read] # allow read adhoc jobs
  job:
    - allow: [read,run,kill] # allow readr/run/kill of all jobs
  node:
    - allow: [read,run] # allow read/run for all nodes
by:
  group: user

---

description: user
context:
  application: 'rundeck'
for:
  project:
    - match:
        name: '【Project】' #後述するProjectと一致させる
      allow: [read] # allow read of 【Project】
by:
  group: user
```
## Project作成
Jobを登録するためのProjectを作成します。
* adminでログイン後Create New Projectを押下
* Project name等を入力し作成

## rundeck-cliインストール
rundeck運用のためrundeck-cliツールを[Rundeck CLI - Install](https://docs.rundeck.com/docs/rd-cli/install.html)を参考にインストールします。
* rundeck-cliインストール
```
[root@linux-rundeck]# curl https://raw.githubusercontent.com/rundeck/packaging/main/scripts/rpm-setup.sh 2> /dev/null | bash -s rundeck
[root@linux-rundeck]# dnf install rundeck-cli
```
* rundeck-cli定義ファイル作成
```
[root@linux-rundeck]# vi rd.conf
export RD_URL=http://【host名】:4440
export RD_USER=admin
export RD_PASSWORD=【パスワード】
```
* rundeck-cliの確認
```
[root@linux-rundeck]# export RD_CONF=/path/to/rd.conf
[root@linux-rundeck]# rd system info
#システム情報が表示されればOK
```
Rundeck準備編はここまでです。
次はJob実行編にてJobを登録します。