【Rundeck】Rundeckでサーバ再起動を含めたJobを作る(Centos8)

# はじめに
rundeckがマイナーなのもありJobの中で再起動を入れたくても説明してしている記事がない。
ちょくちょく英語記事などは見つかるのだがそれぞれ玄人技だったり断片的だったり使いづらい。
そこで今回は[nixy-step-plugins](https://github.com/rundeck-plugins/nixy-step-plugins)という公式で作成されている再起動やwaitのstepを追加してくれるプラグインを紹介する。
また、併せて実際に再起動待ちする簡単なJobを作ってみる。


# nixy-step-pluginsインストール
GUIからインストールもできるが用途ごとにいくつか別れてしまっているので今回はコマンドラインから行う。

```ruby:nixy-step-pluginsインストール
yum install git zip
git clone https://github.com/rundeck-plugins/nixy-step-plugins
cd nixy-step-plugins/
./build.sh
mv build/dist/nixy-step-plugins-* /var/lib/rundeck/libext/
```

ここまでインストール完了、再起動などは必要ない。
Stepを見ると*nixy～が複数追加されていることがわかる。
![rundeck-nixy-step.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1092362/7d9ae73b-d826-019b-5f4f-02d7aa50c66a.png)

これで[nixy-step-plugins](https://github.com/rundeck-plugins/nixy-step-plugins)で追加されたstepは使えるが、このままだとコマンドが足りないため以下を実行しておく。

```ruby:ncインストール
yum install nmap-ncat
```

また、Rundeckを使用する際は何かと捗るのでssh_configに以下の設定をいれておく。

```ruby:ssh_config
echo "StrictHostKeyChecking no" >> /etc/ssh/ssh_config
```

### 再起動待ちJob作成
わかりやすくする為、今回は再起動前と再起動後のuptimeを比較するだけのJobを作成した。
stepひとつづつ説明しても冗長なので「2」,「3」,「4」だけ個別に解説する。
![rundeck-revootJob.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1092362/fe8274cf-99f3-4947-b213-c763e68d8dfe.png)

#### 2.インスタンス再起動
Rundeckはリターンコード0が返ってこないとstepを失敗と判断してしまうため、rebootをバックグラウンドで実行させてexit 0で強制的に0を返させている。
色々やり方は他にもあるが方法の一つとして紹介しておく。
![rundeck-reboot2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1092362/72a17d90-02bf-4db9-cda3-97fc748504ec.png)

#### 3.waitfor
本来は必要ないが初回ログイン時など以降の処理が速すぎて結構事故るので入れている
設定のIntervalは何秒待つか、Cyclesは何回繰り返すか。
![rundeck-reboot3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1092362/14418791-f786-d416-84a3-e37f102ef6cf.png)

#### 4.再起動完了待機
このstepが実際に再起動待ちをする。
ncコマンドを指定した間隔で打ち、返ってくるようになったら後続のstepに処理を渡す。
hostは変数なのでおそらく固定、portは任意、Intervalは何秒待つか、maxtryは何回までトライするか。
このport-openのstepはローカルとリモートの2種類があり今回のケースではLocalを使用しているので注意。
![rundeck-reboot4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1092362/44a33ef9-3788-99ed-acaa-dde3ac4f229a.png)

### Job実行結果
再起動後にuptimeがリセットされておりJobのなかでrebootが走っていることが確認できる。
![rundeck-jobresult.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1092362/0302e3be-c712-3e6f-5682-6fa6568be5a0.png)

### インポート用Job
特になにも考えてないがJobを作ったときは毎回YAMLアップロードしておこうかなと考えている。

<details><summary>再起動待ちJob</summary><div>

```test
- defaultTab: nodes
  description: |-
    ＜説明＞
    再起動前と再起動後にuptimeを取得して起動時間がリセットされていること確認します。
  executionEnabled: true
  id: 0193e0a6-6e76-4398-be48-b241453b23d7
  loglevel: INFO
  name: 再起動待ちJob
  nodeFilterEditable: false
  nodefilters:
    dispatch:
      excludePrecedence: true
      keepgoing: false
      rankOrder: ascending
      successOnEmptyNodeFilter: false
      threadcount: '1'
    filter: .*
  nodesSelectedByDefault: true
  plugins:
    ExecutionLifecycle: null
  scheduleEnabled: true
  sequence:
    commands:
    - description: 再起動前
      exec: uptime
    - configuration:
        command: ssh ${node.username}@${node.hostname} 'sudo reboot & exit 0'
      description: インスタンス再起動
      nodeStep: true
      type: localexec
    - configuration:
        cycles: '1'
        interval: '3'
        progress: 'false'
      description: waitfor
      nodeStep: true
      type: nixy-waitfor-sleep-workflow-node-step
    - configuration:
        host: ${node.hostname}
        interval: '10'
        maxtry: '10'
        port: '22'
      description: 再起動完了待機
      nodeStep: true
      type: nixy-waitfor-local-port-open
    - description: 再起動後
      exec: uptime
    keepgoing: false
    strategy: node-first
  uuid: 0193e0a6-6e76-4398-be48-b241453b23d7
```
</div></details>




# あとがき
それぞれが玄人技でなんとかしている中、公式でpluginを作ってくれていたので、本記事で紹介してみた。
[nixy-step-plugins](https://github.com/rundeck-plugins/nixy-step-plugins)が入っていれば前回紹介した「3.yaceインストール」もインポートできるし実行できる。
ansibleでやればいいじゃんで終わりだけど、目的を実現する手段が増えるのはいいことだと思うので。
(そもそもansibleとrundeckは役割違うのはおいておいて)
なお、今回紹介したのはport-openとsleepだけだけどファイルの存在確認して分岐させたりほかにもいろいろなstepが用意されているのでご興味のある方は触ってみると夢が広がるかもしれません。
あ、私がもっと調べるんですね。はい。