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 からプロジェクトを追加します。
Create a new Project の画面になります。
リモートノードのリストの設定ファイルや、リモートノードの実行方法が設定できます。
Project Name だけ入力して、他はデフォルトのままで Create します。
プロジェクトが作成できたら、次はジョブを追加します。
まんなかの Create a new Job.. から追加します。
Create New Job の画面になります。
それっぽく入力します。
- 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 を押して実行します。
次のような感じで実行結果が表示できます。
リモートノードの登録
最初にプロジェクトを追加したときに、デフォルトで設定されていた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>
リモートノードで実行するジョブを登録
ジョブの追加の画面の Nodes で Dispatch to Nodes で選択して、ノードのパターンを入力します。例えば server[123]
とすれば↑で追加したリモートノードがすべて含まれます。
ジョブを実行すると、次のように3つのノードでスクリプトが実行されます。
あと、プロジェクトを追加するときの設定で Resource Model Source とかいうのがあって、デフォで resources.xml
が追加されていてそのままで登録しましたけど、Script や URL Source というソースも追加できるようなので、ノードのリストを動的にすることもできると思います。
アドホックにノードとコマンドを指定して実行
ジョブを定義しなくても、画面↑の Commands を選択するとアドホックにコマンドを実行することもできます。
Command に実行するコマンドを、Nodes に実行するノードのパターンを入力して実行します。
これは便利。
さいごに
今のところ定期的なタスクは Ansible で /etc/cron.d/ に撒く方法で困っていないので、使うことはないかなーと感じました。