Rundeck 使ってみた

[Rundeck](http://rundeck.org/) を使ってみました。

- いわゆるジョブスケジューラー
- Jenkins みたいなやつ
- Jenkins は CI が基本だけどこれはオペレーションとかの運用が主
- エージェントレスで SSH であれこれする

# vagrant で環境の準備

vagrant で環境を作ります。リモートノードでもジョブを実行してみたいので Rundeck のサーバとは別に３つサーバを作ります。

**Vagrantfile**

```ruvy
Vagrant.configure(2) do |config|

  config.vm.box = "bento/centos-7.1"

  config.vm.define "rundeck" do |c|
    c.vm.hostname = "rundeck"
    c.vm.network "private_network", ip: "192.168.33.10", virtualbox__intnet: "rundeck"
    c.vm.network "forwarded_port", guest: 4440, host: 4440
    c.vm.provider :virtualbox do |v|
      v.memory = "2048"
    end
  end

  config.vm.define "server1" do |c|
    c.vm.hostname = "server1"
    c.vm.network "private_network", ip: "192.168.33.11", virtualbox__intnet: "rundeck"
  end

  config.vm.define "server2" do |c|
    c.vm.hostname = "server2"
    c.vm.network "private_network", ip: "192.168.33.12", virtualbox__intnet: "rundeck"
  end

  config.vm.define "server3" do |c|
    c.vm.hostname = "server3"
    c.vm.network "private_network", ip: "192.168.33.13", virtualbox__intnet: "rundeck"
  end

  config.vm.provider :virtualbox do |v|
    v.linked_clone = true
  end

end
```

up して rundeck にログインします。

```sh
vagrant up
vagrant ssh rundeck
```

rundeck をインストールして開始します。

```sh
sudo yum install -y http://repo.rundeck.org/latest.rpm
sudo yum install -y java-1.8.0-openjdk rundeck
sudo service rundeckd start
sudo service rundeckd status
sudo chkconfig rundeckd on
```

4440 ポートでリッスンするので、ブラウザで開きます。

```sh
open http://localhost:4440/
```

ログイン画面が表示されるので `admin` `admin` でログインします。

# ローカルノードで実行するジョブを登録

Rundeck は **Project -> Job -> Step** のような階層になっています。ので、まずはプロジェクトを追加します。

ログイン後の画面の真ん中の **New Project** からプロジェクトを追加します。

![010-welcome.png][]

----

**Create a new Project** の画面になります。

リモートノードのリストの設定ファイルや、リモートノードの実行方法が設定できます。

**Project Name** だけ入力して、他はデフォルトのままで **Create** します。

![020-create-project.png][]

----

プロジェクトが作成できたら、次はジョブを追加します。

まんなかの **Create a new Job..** から追加します。

![030-project-empty.png][]

----

**Create New Job** の画面になります。

![040-create-job.png][]

それっぽく入力します。

- Options に設定した値はジョブの実行時に設定することができて環境変数になる
- Workflow の If a step fails でジョブの複数ステップの途中でコケたときにどうするか設定
  - Stop at the failed step なら停止する
  - Run remaining steps before failing. ならそのまま続行する
- Strategy は複数ノード＆複数ステップのときにどのような順番で実行するか
  - すぐ横の Explain でわかりやすい例が表示される
- Add a Step でジョブのステップを追加する
  - これは複数追加できる
  - 試しに Script を追加してみる
- Nodes で実行するノードをしていする
  - リモートノードをまだ追加していないので Execute locally にします
- ほかにもいろいろ設定できる
  - 通知（メール・WebHook）とか
  - 繰り返し（日次・月次・crontab）とか
  - 同時実行を許可するかどうかとか
  - その他色々
- とりあえず他はデフォルトのまま Create する

実行するスクリプトは次のようにしました。

```sh
uname -a
whoami
pwd
env | sort
```

----

ジョブが作成できたら **Run job Now** を押して実行します。

次のような感じで実行結果が表示できます。

![050-log-output.png][]

## リモートノードの登録

最初にプロジェクトを追加したときに、デフォルトで設定されていたSSH鍵のディレクトリに秘密鍵と公開鍵があります。

```
sudo ls -l /var/lib/rundeck/.ssh/
```

```
total 8
-rw-------. 1 rundeck rundeck 1679 Jan  5 20:44 id_rsa
-rw-r--r--. 1 rundeck rundeck  382 Jan  5 20:44 id_rsa.pub
```

この鍵でリモートノードに SSH でログインするので、リモートノードにユーザーを作成してこの公開鍵を設置します。

```sh
# vagrant ユーザーの SSH 鍵を設置
ssh-copy-id 192.168.33.11
ssh-copy-id 192.168.33.12
ssh-copy-id 192.168.33.13

# rundeck ユーザーを作成して鍵をコピー
for h in 192.168.33.11 192.168.33.12 192.168.33.13; do
  sudo cat /var/lib/rundeck/.ssh/id_rsa.pub |
    ssh $h '
      set -eux
      id rundeck >/dev/null || sudo useradd -m -r rundeck
      sudo mkdir -p /home/rundeck/.ssh
      sudo tee /home/rundeck/.ssh/authorized_keys >/dev/null
      sudo chmod 700 /home/rundeck/.ssh
      sudo chmod 600 /home/rundeck/.ssh/authorized_keys
      sudo chown -R rundeck: /home/rundeck/.ssh
    ' 2>&1 | sed "s/^/$h: /"
done
```

ノードの追加は Web からはできないので、Rundeck サーバのファイルを直接編集します。

```sh
sudo vi /var/rundeck/projects/test/etc/resources.xml
```

次のように追記します。

```xml
<?xml version="1.0" encoding="UTF-8"?>

<project>
  <node name="localhost" description="Rundeck server node" tags="" hostname="localhost" osArch="amd64" osFamily="unix" osName="Linux" osVersion="3.10.0-229.14.1.el7.x86_64" username="rundeck"/>

  <!-- ここから追記 -->
  <node name="server1" description="Remote Server node" tags="" hostname="192.168.33.11"
    osArch="amd64" osFamily="unix" osName="Linux" osVersion="CentOS 7 x86_64" username="rundeck"/>
  <node name="server2" description="Remote Server node" tags="" hostname="192.168.33.12"
    osArch="amd64" osFamily="unix" osName="Linux" osVersion="CentOS 7 x86_64" username="rundeck"/>
  <node name="server3" description="Remote Server node" tags="" hostname="192.168.33.13"
    osArch="amd64" osFamily="unix" osName="Linux" osVersion="CentOS 7 x86_64" username="rundeck"/>
  <!-- ここまで追記 -->

</project>
```

## リモートノードで実行するジョブを登録

ジョブの追加の画面の **Nodes** で **Dispatch to Nodes** で選択して、ノードのパターンを入力します。例えば `server[123]` とすれば↑で追加したリモートノードがすべて含まれます。

![060-remote-nodes.png][]

ジョブを実行すると、次のように３つのノードでスクリプトが実行されます。

![070-remote-exec.png][]

あと、プロジェクトを追加するときの設定で **Resource Model Source** とかいうのがあって、デフォで `resources.xml` が追加されていてそのままで登録しましたけど、Script や URL Source というソースも追加できるようなので、ノードのリストを動的にすることもできると思います。

## アドホックにノードとコマンドを指定して実行

ジョブを定義しなくても、画面↑の Commands を選択するとアドホックにコマンドを実行することもできます。

**Command** に実行するコマンドを、**Nodes** に実行するノードのパターンを入力して実行します。

![080-adhoc.png](https://qiita-image-store.s3.amazonaws.com/0/8734/7ac5b8b9-c686-d1f6-3a11-b56ee6ba7e13.png)

これは便利。

## さいごに

今のところ定期的なタスクは Ansible で /etc/cron.d/ に撒く方法で困っていないので、使うことはないかなーと感じました。

## 参考

- [ジョブスケジューラ「Rundeck」を試してみる ｜ Developers.IO](http://dev.classmethod.jp/server-side/server/try-rundeck-job/)
- [そんなスケジューラで大丈夫か？ Rundeck超入門(基礎編) - くろのて](http://note.crohaco.net/2015/rundeck-basic/)

[010-welcome.png]:
  https://qiita-image-store.s3.amazonaws.com/0/8734/386534b0-5876-d802-6090-8d1c2f239110.png
[020-create-project.png]:
  https://qiita-image-store.s3.amazonaws.com/0/8734/4111f3ab-981a-08d8-eb29-0cdccdd23791.png
[030-project-empty.png]:
  https://qiita-image-store.s3.amazonaws.com/0/8734/57796734-3432-d874-928a-4eb652f8012b.png
[040-create-job.png]:
  https://qiita-image-store.s3.amazonaws.com/0/8734/4c53e2b6-170b-f60c-9c92-279b4e97e819.png
[050-log-output.png]:
  https://qiita-image-store.s3.amazonaws.com/0/8734/f726eea7-1159-0ad9-f503-2a80523ed7f8.png
[060-remote-nodes.png]:
  https://qiita-image-store.s3.amazonaws.com/0/8734/af35de56-c68e-d705-be6f-fd0ecd74f353.png
[070-remote-exec.png]:
  https://qiita-image-store.s3.amazonaws.com/0/8734/ea3cb71b-e353-286f-e876-f473579f19fa.png