WindowsのRundeckでWindowsのPCをノードにする

# 初めに
ジョブ管理ツールの[Rundeck](https://www.rundeck.com/)をWindowsのPCにインストールし、ノードにしたいWindowsPCをつなげる設定に大変難儀したため、後のために手順メモを残します。
以下、RundeckをインストールするWindowsPCを「サーバPC」、ノードにしたいWindowsPCを「ノードPC」とします。

# 環境
###サーバPC
OS:Windows 10

###ノードPC
EC2インスタンス
OS：Windows Server 2019

# 手順
## Rundeckのインストール
サーバPCにRundeckをインストールします。
RundeckのインストールにはRundeck以外に必要なものや必要な手順がそこそこあるため、簡単のためにChocolateyでインストールしちゃいます。
ページは[こちら](https://community.chocolatey.org/packages/rundeck)。バージョンの指定もできます。
※更新・削除には難があるそうです

```
choco install rundeck
```
## ファイアウォールの設定
`C:\rundeck\etc\framework.properties`を確認します。
`framework.server.port`の数字がRundeck用のportになるため、受信の規則でこれを追加します。デフォルトでは「4440」です。

## ブラウザでアクセス
ここまで出来たらバッチファイル`C:\rundeck\start_rundeck.bat`を実行し、Rundeckの画面にChromeなどのブラウザでアクセスします。
バッチ実行から画面が立ち上がるまでやや時間がかかります。
URLは先ほどと同じ`C:\rundeck\etc\framework.properties`ファイルの`framework.server.url`。
ユーザ名：admin
パスワード：admin
です。

## SSH接続（公開鍵認証）の設定
ノードPCはOpenSSHが既に起動していることを前提とします。
### 手順１：サーバPCで鍵作成
まず、以下のコマンドでサーバPCで秘密鍵・公開鍵のペアを作成します。
ただの`ssh-keygen`だとRSAでなくOpenSSH形式の鍵が作られてしまうため、Rundeckで使用できなくなってしまいます。

```
ssh-keygen -t rsa -b 4096 -m pem
```

今回は、鍵の作成先を`C:\rundeck\sshkeys\id_rsa`とします。
指定した`C:\rundeck\sshkeys`フォルダに
秘密鍵：id_rsa
公開鍵：id_rsa.pub
が作成されます。

### 手順２：ノードPCに公開鍵配置
公開鍵をノードPCに配置します。
ノードPCに`C:\Users\<username>\.ssh`というフォルダがあるはずなので、そこに作成した`id_rsa.pub`をコピーし、`authorized_keys`にリネームします。すでにある場合は追加します。
また、`C:¥ProgramData¥ssh\sshd_config`をメモ帳などで開き、設定を変更します。

- 「#PasswordAuthentication yes」→「PasswordAuthentication no」
- 一番最後の2行（「Match Group administrators」ともう一行）の先頭に「#」を付けコメントアウト
- 「サービス」を開き、OpenSSHを再起動

### 手順３：サーバPCでRundeckに秘密鍵登録
サーバPCに戻り、ブラウザでRundeckの画面を開きます。
右上の歯車を押し、「Key Strage」を選択します。
<img width=50% alt="Key Storage" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343311/d19442dc-d9cc-d535-333c-23919d9a45df.png>
Key Storageの画面になったら「Add or Upload a Key」ボタンを押し、先ほど作った秘密鍵を登録します。
<img width=50% alt="Add a Key" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343311/b9cc1b23-0507-f858-279d-28650eead3ee.png>

| 入力欄 | 今回入力する内容 | 説明 |
|:-:|:-:|:-:|
|  Key Type |  Private Key |接続に使うものを指定|
|  ファイルをアップロード | C:\rundeck\sshkeys\id_rsa |コマンドで作った秘密鍵|
| Storage Path  | （keys/）rundeck  |任意の文字列　フォルダ名|
| Name  | id_rsa | 任意の文字列　ファイル名|

`Storage Path`はフォルダ名、`Name`はそのフォルダの中に作られる鍵の名前になります。今回は`Storage Path`を`rundeck`, `Name`を`id_rsa`としました。
こうすると、`C:\rundeck\var\storage\content\keys\<Storage Path>\<Name>`、すなわち`C:\rundeck\var\storage\content\keys\rundeck\id_rsa`というパスで、参照元`C:\rundeck\sshkeys\id_rsa`と同じ内容の秘密鍵が作成されます。
※`meta`フォルダの方には作成された鍵の情報が入っており、`content`フォルダの中に手動で鍵を置いてもmeta情報がないので秘密鍵としては認識されません。

以下の画像のように🔓マーク＋`Name`で指定した鍵が`Storage Path`に作られていることが確認できます。
<img width=50% alt="鍵アイコンが表示される" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343311/771f9f6a-a8f1-8aef-eeab-b1e8179b0c9f.png>
Key Storageに作成した鍵はセキュリティ設定が`too open`であるため、セキュリティ設定を参照元の秘密鍵と同様のものに変更します。
右クリック→プロパティ→セキュリティ→詳細設定　から変更します。
ここまで出来たらRundeckに登録された鍵で通信ができるかを念のため確認します。
今回の場合は以下になります。

```cmd
ssh <username>@<ノードPCのIP> -i C:\rundeck\var\storage\content\keys\rundeck\id_rsa
```

接続が確立されればOKです。通信できない場合はセキュリティ設定などを見直してみてください。

## Rundeck上でのノード追加
まず、プロジェクトを作成します。
作成したプロジェクトの「Edit Nodes...」メニューを開き、`resource.xml`を作成していきます。
「Sources」タブの「Add a new Node Source」ボタンを押し、「File」を選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343311/d5d06ef5-e174-98d2-67c4-cd233072fe05.png)

`Format`を`resourcexml`、`File Path`を`C:\rundeck\projects\<作成したプロジェクト名>\etc\resource.xml`として、後のチェックを全て入れます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343311/49b5a59d-9ac7-766c-f737-52b8dac1c107.png)
↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343311/a241c580-8233-8e2b-e60e-f56d08fb239d.png)
そしてSaveするとxmlファイルが作られ、「Edit」タブでrecource.xmlが編集できるようになるので、「Modify」ボタンからXMLを編集し、ノードを追加します。最初から入力されているノードはサーバPC自身です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343311/34a48787-356d-31e0-963e-b97fb55b0dad.png)
これで保存すればこのプロジェクトのノードとしてノードPCが表示されるようになるはず。

## おまけ：複数のノードのうちランダムな一つでジョブ実行
分散処理っぽいけど分散処理じゃないジョブ実行。
ジョブの設定「Nodes」の一番下「オーケストレータ」の項目で`Random Subset`を選択し、「Count」を`1`とすることで設定可能。
ただし、良い感じに分散されるわけではないので、同じノードで実行されることもある。

# 終わりに
Linuxの資料なら見つかるのですがWindowsだと一連の流れがなかなか見つからず、本当にやりたいことの前に上記の設定段階で詰まってしまって大変でした。
特にSSH接続の段階では色々なセキュリティが絡むので（ファイアウォール設定、セキュリティグループのインバウンド設定、鍵のセキュリティ設定）今詰まっているのがどこなのか分からず大変でした…。