DACエンジニアブログ:アドテクゑびす界

DACのエンジニアやマーケター、アナリストが執筆するアドテクの技術系ブログです。

Rundeck&Win32-OpenSSHでWindowsのバッチをリモート実行させてみました

こんにちは。インフラ開発部の福本です。

Webサービスの提供を長く続けていると、どうしても継ぎ接ぎで改修が行われていくことも多く、それにあわせてスケジュール登録されるCronやTaskなども煩雑になってきますよね。

開発メンバーが異動でいなくなってしまうと、そもそもどこで何の処理が動いているのか探すだけで1時間、みたいなこともよくあります。

そういったことが続くと、やはりジョブ管理ソフトが欲しくなってくるものです。

ということで、今回はRundeck&Windowsについて検証してみたので、共有してみたいと思います。

Rundeckとは?

ひとことで言うと、オープンソースのジョブスケジューラです。 http://rundeck.org/

マネージャのインストール先はLinuxになりますが、エージェントはLinux・Windowsどちらも対応しているようです。

検証ざっくり構成

Rundeckマネージャ:CentOS 7 Rundeckエージェント:WindowsServer2008R2

ということで、今回はマネージャをインストールし、エージェントとしてWindowsを指定した構成で検証してみました。 (マネージャ・エージェントともにLinuxの構成はよく見かけますし・・・)

Rundeckインストール

最新のユーザーガイドがありましたので、そちらを参考に進めます。(記事執筆時点では、2.6.2が最新でした) http://rundeck.org/docs/

簡単ガイドでは指定の jar ファイルを起動すればいいとのことですが、さすがにそれでは記事にはならないので。。

ということで、まずはJavaのインストールです。

[code language="shell"] yum install java-1.7.0 [/code]

次に、利用ポートの確認です。

そのままプロンプトが返ってくれば(値が表示されなければ)大丈夫です。

[code language="shell"] netstat -an | egrep '4440|4443' [/code]

では、Rundeckのインストールです。RPMで入れました。

[code language="shell"] rpm -Uvh http://repo.rundeck.org/latest.rpm yum install rundeck [/code]

Rundeckセットアップ

インストールが完了したら、まずは起動してみます。

[code language="shell"] chkconfig rundeckd on service rundeckd start [/code]

お約束ですが、URLがlocalhostに設定されており、アクセスするとlocalhostにリダイレクトされてしまうのでこちらの変更を行います。検証なのでIP指定しました。

/etc/rundeck/rundeck-config.properties

[code]

grails.serverURL=http://localhost:4440

grails.serverURL=http://(RundeckのサーバIP):4440 [/code]

早速ブラウザでアクセス・・・と思いきや、CentOS7のFirewalldで若干つまずき。。。

気を取り直してアクセス!初期アカウントのadminでログインしてみます。 001無事に表示できました。

では、プロジェクトおよびジョブを作成して、ローカルホストでのジョブ実行を行ってみます。 (プロジェクトの作成は割愛します。)

ジョブ作成ではワークフローに従って実行内容を記述するようですが、いろいろなオプションが取れるようですね。今回はコマンドを選んでいます。

Rundeck_Workflowローカルホストでの実行なので、"Execute locally" を指定しておきます。

Rundeck_local

では、ジョブを作成したので、実行してみます。 Rundeck_definition実行結果が表示されますね。各タブで詳細をすぐ確認できるのは便利です。

ジョブエラー時のコマンドを定義することもできます。 すでに上述の画面でDefinitionタブ内でエラー処理が書いてあります。

そこで、ありもしない"dates"コマンドを実行させて、メインの処理はエラーとさせておき、エラー処理として定義されたコマンドを続けて実行させてみます。

Rundeck_onerror

その結果、ちゃんとエラー処理できてファイルも作成されていました。

[code language="shell"] ls -la /tmp/test -rw-rw-r--. 1 rundeck rundeck 7 2月 8 18:38 /tmp/test [/code]

WindowsへのSSHインストール・セットアップ

さて、次はWindowsエージェントのセットアップです。 Cygwinが推奨されていますが、せっかくなのでプレリリースされたOpenSSHで検証してみたいと思います。

というわけで、インストールです。

https://github.com/PowerShell/Win32-OpenSSH/releases

ここのZIPファイルをダウンロードして展開するだけで大丈夫なようです。 今回は最新版(2016/2/2版)をCドライブ直下に、OpenSSH-Win64フォルダを作成しました。

セットアップは以下の通り。まずは鍵を作成。

[code language="shell"] cd c:\OpenSSH-Win64 ssh-keygen.exe -t rsa -f ssh_host_rsa_key ssh-keygen.exe -t dsa -f ssh_host_dsa_key ssh-keygen.exe -t ecdsa -f ssh_host_ecdsa_key ssh-keygen.exe -t ed25519 -f ssh_host_ed25519_key [/code]

公開鍵認証を有効にするため、OpenSSHフォルダにある下記コマンドを実行して、OS再起動。

[code language="shell"] setup-ssh-lsa.cmd [/code]

OS再起動完了後、SSHDをサービス登録しました。

OpenSSHフォルダにある下記コマンドを実行してインストールし、必要に応じてスタートアップの種類変更を行います。

[code language="shell"] sshd.exe install [/code]

サービス起動ができるのは便利ですね。 SFTPの設定もできるようですが、今回は割愛します。

エージェント側Rundeck設定

続いて、Rundeckの設定です。 Rundeckを実行するユーザーをWindows上で作成し、.sshフォルダを作成します。

手抜きですが、今回は実行ユーザーとしてRundeckユーザーを作成しました。 で、コマンドプロンプトで、以下のように実行し、.sshフォルダを作成。(GUI上からは作成できませんでした・・・)

[code language="shell"] cd C:\Users\rundeck mkdir .ssh [/code]

ここに、Rundeckマネージャ内の、Rundeckユーザーの鍵を配置します。 ※もちろん、実行ユーザーに応じて変更することになりますが、今回は検証なので。。

/var/lib/rundeck/.ssh/id_rsa.pub → C:\Users\rundeck.ssh\authorized_keys

念のため、SSHでログインできることを確認しておきます。

[code language="shell"] ssh -i /var/lib/rundeck/.ssh/id_rsa rundeck@(クライアントIP) [/code]

WindowsにSSHができるのはちょっと面白いですね。

次にエージェントとなるノードをRundeckマネージャ側に追加します。 プロジェクト単位でノードを構成するようです。 下記XMLの修正が必要で、GUIでの作成はできないようです。

[code] /var/rundeck/projects/(プロジェクト名)/etc/resources.xml [/code]

ここの、タグ内に追記していくイメージです。

[code language="xml"] <node name="(RundeckのGUIで表示させる名前)" description="(コメント) tags="" hostname="(IPもしくはホスト名)" osArch="Intel64" osFamily="Windows" osName="WindowsServer2008" osVersion="R2" username="rundeck"/> [/code]

osFamilyやosVersionなどの項目は、GUI上でノードを検索するときに使うようですが、他にもあるかもしれません。

では、ジョブ作成です。

違いは簡単、コマンド定義をWindowsに合わせること、実行先ノードを"Dispatch to Nodes"とし、検索して指定する必要があります。

Node Filterでの指定が若干慣れが必要になる部分かと思いますが。。

Rundeck_wincmd Rundeck_remote

今回は簡単なバッチファイルをエージェント側に作成し、Remoteでジョブを実行してました。

Rundeck_remoteresult

ご覧のとおり、問題なく実行完了できました! 上述のSSH疎通確認の時点で半分以上成功のようなものですが。。。

ちなみにファイル作成者はrundeckになっていましたので、SSHで関連付けたWindowsアカウントで実行されているようです。

運用にあたっての課題

なかなかいい感じのRundeckですが、現時点で疑問・課題も見えてきました。

  • 複雑なジョブフローは組めるのか? (エラー処理はできるみたいですが、JP1みたいにファイル監視で処理続行などできると嬉しい)
  • Windowsドメインアカウントでリモート実行できるのか? (おそらく大丈夫だと思いますが、検証はしないと・・・)
  • ノードやプロジェクトの効率的な管理方法
  • Rundeckマネージャサーバの冗長構成
  • GUIの日本語正式対応(オペレーション移管の観点)

などが思いつくところです。そもそも機能把握が先ですが。。。

ただ、非常に機能豊富なソフトウェアですので、引き続き検証していきたいと思います。

参考サイト

http://note.crohaco.net/2015/rundeck-basic/ http://dev.classmethod.jp/server-side/server/try-rundeck-job/ https://github.com/PowerShell/Win32-OpenSSH/wiki