Rundeckを使ってみた

ジョブ管理ツールについて調べていた時にJenkins以外にRundeckというものをみつけたので調べたり使ってみました。

## Rundeckとは
### ひと言で
使い勝手のよいOSSのジョブ管理ツール

### もう少し詳しく
- ホームページ
https://www.rundeck.com/
- RundeckはOSS(Community版)として公開（Apache2.0 License）しています
- PagerDuty社が主なメンテナー?であり、Community版のほかにEnterprise版やCloud版と展開しています
#### プロダクトの種類について
以下のラインナップを展開しているようです。
- Rundeck(Community版, OSS)
- PagerDuty Process Automation On Prem Software(Enterprise版)
- PagerDuty Runbook Automation(Cloud版)
- PagerDuty Automation Actions(セルフヒーリング用のAdd-onらしい)

#### Community版とEnterprise版の違い
以下のページに比較内容があるのでこちらをみてください。
https://www.rundeck.com/community-vs-enterprise

ここでは個人的に気になった違いをいくつかピックアップします。
- RASIS観点
    - HA構成が可能
    - スケーラブルな構成が可能
    - SSO
    - 失敗したジョブの再開
- ユーザビリティ
    - ワークフローの可視化
    - システム設定をGUIで実施。HA構成サーバ間の同期
- 連携
    - Webhook(CommunityではRundeck自身かログくらい。GitHubやSNSが無い)

RASIS観点について詳しく調べたわけではありませんが、そこそこシビアなジョブ連携が必要なプロジェクトでは初めからEnterprise版のほうがよさそうです。
ワークフローの可視化はCommunity版でもほしいです・・。図で見えてジャンプできるのはほしい。
サンプルイメージがあまりないのですがおそらく以下のイメージだと思います。
- サンプルイメージ  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129204/0bb56742-a5b6-b683-087b-eca50310b29b.png)




### Jenkinsとの違い
Jenkinsは開発用でありRundeckは運用用というユースケースの違いがあるということ。
Jenkins vs Rundeckではなく、Jenkins and Rundeckの使い方を提案していてお互いに連携するためのPluginが存在している。
GitHubのRundeckリポジトリにあるFAQにそのような記載がある  
https://github.com/rundeck/rundeck/wiki/FAQ#how-is-it-different-from-jenkins

とはいえ、具体例を出さないとわかりづらい。Jenkinsと比較した結果はいずれそのうちまた今度整理したい。

## Rundeckの良いところ
- 操作がわかりやすい
- スケジュール設定が簡単、crontabライクに設定することも可能
- ジョブ定義の設定をテキスト(XML,YAML)で出力可能
- 追記1. ジョブ実行時に引数指定が可能かつ手順を書ける
## Rundeckのインストール
### 環境
- VirtualBox
    - Ubuntu20.04.4 Server

### インストール手順
[公式の手順](https://docs.rundeck.com/docs/administration/install/linux-deb.html) をみるのがベストですが、
お試しでやるので、手順のタブは`Community`を選択してください。
何点か変更しているので以下に記載します。
```
# 初期状態のVMにインストールする場合は、事前に実施
sudo apt-get update
# 公式手順どおり、インストール
sudo apt-get install openjdk-11-jre-headless
curl https://raw.githubusercontent.com/rundeck/packaging/main/scripts/deb-setup.sh 2> /dev/null | sudo bash -s rundeck
curl -L https://packages.rundeck.com/pagerduty/rundeck/gpgkey | sudo apt-key add -
sudo apt-get update
sudo apt-get install rundeck
# serviceコマンドの代わりにsystemctlコマンドで起動、VM起動時に自動起動するように設定
sudo systemctl start rundeckd
sudo systemctl enable rundeckd
# 公式手順通り、起動確認
# 以下が出力されていること
# Grails application running at http://localhost:4440 in environment: production
tail -f /var/log/rundeck/service.log
```
- 手順を実行すると以下がインストールされる
    - openjdk-11-jre-headless
    - Rundeck 4.4.0.20220714

## Rundeckを使ってみる
### ログイン
- 手順通り、`http://localhost:4440`に、admin/adminでログインする
    - Ubuntu Serverを使用しているので、ポートフォワードして自端末のChromeでログイン
    - ポートフォワード設定は、localも4440にしてください
        - リダイレクト時に4440ポートをRundeckが指定するため別のポート番号だとログインできません

### 操作をお試し
- プロジェクトを作成する
![](https://i.imgur.com/MUqiYXt.png)
- ジョブを作成する
![](https://i.imgur.com/7mdCcgH.png)
- ジョブを作成するには、Workflowが１つ以上必要。ということでステップを追加  
`Command`を選択して、テキトウに入力する
![](https://i.imgur.com/fIVShCy.png)
![](https://i.imgur.com/mfcgbQe.png)
- テキトウに2つステップを作成する
![](https://i.imgur.com/bFgdBy2.png)
- 今すぐジョブを実行
![](https://i.imgur.com/r1xmR7W.png)
- 実行結果
![](https://i.imgur.com/Lfk1gKX.png)
- ログ出力をクリックするとログが表示される
![](https://i.imgur.com/XesJSlh.png)

### スケジュールを設定してみる
- 1日1回、週1回、月1回、年1回などは簡単に設定できる
![](https://i.imgur.com/rHL53BK.png)

- crontabライクな設定もできる
    - crontabは秒設定はできない？ようですが、こちらでは可能です
        - 1分に1回
            ![](https://i.imgur.com/EWsRTVV.png)
        - 1秒に1回
            ![](https://i.imgur.com/5oA0lEz.png)
### ジョブなどはコード管理できる
- XMLかYAML形式で出力できるため、Gitなどでコード管理が可能です
    - YAMLの例
        ```YAML
        - defaultTab: nodes
          description: |-
            job description
            ## ジョブ１
            ### ジョブの説明
            - あああ
            - いいい
            - ううう
          executionEnabled: true
          id: f909cbc1-445a-441b-aa11-37bd4001e35e
          loglevel: INFO
          name: job1
          nodeFilterEditable: false
          plugins:
            ExecutionLifecycle: null
          schedule:
            dayofmonth:
              day: '*'
            month: '*'
            time:
              hour: '*'
              minute: '*'
              seconds: '*/1'
            year: '*'
          scheduleEnabled: false
          sequence:
            commands:
            - description: step-label1
              exec: echo this is a test.; uname -a
            - description: step-label2
              exec: date
            keepgoing: false
            strategy: node-first
          timeZone: JST
          uuid: f909cbc1-445a-441b-aa11-37bd4001e35e
        ```
### 追記1. ジョブ実行時に引数指定が可能かつ手順を書ける
引数が指定できるのはJenkinsでも同じですが、Rundeckでは条件を指定したり手順のように書くこともできる
- 下の画像ではテキストにしたが、ファイルを指定することもできるようだ  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129204/6577525f-8acc-7eaf-fa7c-984b1508552e.png)
- 実行画面はこんな感じに手順っぽくできるので作業者にやさしい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129204/6793aa98-4d09-efdc-52f0-49fe9e344fcf.png)

### 追記2. ユーザーの追加
Rundeckを利用するユーザーを追加します。デフォルトではadminしかありません  
Enterprise版では、GUIで追加設定が可能です（[マニュアル該当ページ](https://docs.rundeck.com/docs/manual/user-management/user-mgmt.html)）
Community版では以下の手順でユーザーを追加します  
- パスワードのハッシュ値を生成する（任意）
- realm.propertiesにユーザー・パスワードを追記する
- Rundeckを再起動することで変更が反映されます
    
#### ユーザー追加手順
- パスワードのハッシュ値を生成する（任意）
    `sudo java -jar /var/lib/rundeck/bootstrap/rundeck-4.4.0-20220714.war --encryptpwd Jetty`
    - 対話形式でユーザー名とパスワードを入力します
    - 出力されたbcryptの値を使用します
    - 実行例  
        ```
        sudo java -jar /var/lib/rundeck/bootstrap/rundeck-4.4.0-20220714.war --encryptpwd Jetty
        Required values are marked with: * 
        Username (Optional, but necessary for Crypt encoding):
        aki-nasu-admin
        *Value To Encrypt (The text you want to encrypt):
        aki-nasu

        ==ENCRYPTED OUTPUT==
        bcrypt: BCRYPT:aaabbbccc.aaabbbccc.aaabbbccc.
        obfuscate: OBF:aaabbbccc
        md5: MD5:aaabbbccc
        crypt: CRYPT:aaabbbccc
        ```
    - 同じことがGUIでも可能です。右上のギアアイコンから `Password Utility` を選択して出てくる以下の画面を使います
        ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129204/a25e2114-adc0-5441-4766-65f82148139e.png)

- `/etc/rundeck/realm.properties` にユーザー・パスワードを追記する
    - admin自身も早めに変更しておいたほうがよいでしょう
    - 追記例(admin行はデフォルトで存在する)
        ```
        admin:admin,user,admin,architect,deploy,build
        aki-nasu-admin:BCRYPT:aaabbbccc.aaabbbccc.aaabbbccc.
        ```
- 参考ページ
    - [PropertyFileLoginModule](https://docs.rundeck.com/docs/administration/security/authentication.html#propertyfileloginmodule)
- Rundeckを再起動することで変更が反映されます
`sudo systemctl reload rundeckd`

#### ホットリロード設定をおこなう
デフォルトではユーザー追加後にRundeckの再起動が必要なため、ホットリロード設定をおこないます
```
# バックアップを取っておく
sudo cp -p /etc/rundeck/jaas-loginmodule.conf /etc/rundeck/jaas-loginmodule.conf.original
# 修正する
sudo vi /etc/rundeck/jaas-loginmodule.conf
# 修正箇所は以下の通り
sudo diff /etc/rundeck/jaas-loginmodule.conf /etc/rundeck/jaas-loginmodule.conf.original
2c2
< org.rundeck.jaas.jetty.ReloadablePropertyFileLoginModule required
---
> org.eclipse.jetty.jaas.spi.PropertyFileLoginModule required
```
- 参考ページ
    - [Hot Reloading the `realm.properties` file](https://docs.rundeck.com/docs/administration/security/authentication.html#propertyfileloginmodule)

実際に追加できたことは、右上のギアアイコンから`User Summary`画面を表示することで確認できます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129204/173c8751-c4c5-a1f4-6e6d-b171ab7d1dfb.png)


## さいごに
導入の手軽さはcrontabには敵わないが、比較的簡単にできた
実践的な使い方ができたら、つづく。