Help us understand the problem. What is going on with this article?

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/ に撒く方法で困っていないので、使うことはないかなーと感じました。

参考

ngyuki
テック系男子。 ただのやってみた系の記事ははてなブログに、それ以外の技術系のネタは Qiita に投稿します。
https://ngyuki.jp/
headjapan
中規模~大規模の安定した基幹システム・大規模サイトの分析・要件定義・設計・開発を得意とする、総合的な開発会社です。
http://www.headjapan.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away