rundeck

Rundeck 使ってみた

More than 3 years have passed since last update.

Rundeck を使ってみました。


  • いわゆるジョブスケジューラー

  • Jenkins みたいなやつ

  • Jenkins は CI が基本だけどこれはオペレーションとかの運用が主

  • エージェントレスで SSH であれこれする


vagrant で環境の準備

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

Vagrantfile

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 にログインします。

vagrant up

vagrant ssh rundeck

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

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 ポートでリッスンするので、ブラウザで開きます。

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 する

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

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 でログインするので、リモートノードにユーザーを作成してこの公開鍵を設置します。

# 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 サーバのファイルを直接編集します。

sudo vi /var/rundeck/projects/test/etc/resources.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>


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

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

060-remote-nodes.png

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

070-remote-exec.png

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


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

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

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

080-adhoc.png

これは便利。


さいごに

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


参考