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


DACエンジニア採用情報

  関連記事

ActiveDirectoryをフォレスト間で移行する(その2)

こんにちは。インフラ開発部の福本です。 2015年も残り約半分ですね。ボーっとしていると、あっという間に日々が過ぎていきます。 その中、少しずつ迫るWindowsServer2003のサポート期限。 保守切れとなるサーバOSの移行に忙殺されているサーバ管理者の方も、いらっしゃるのではないでしょうか。 …

Vagrantの機能を使って開発環境の効率をあげてみた。

プラットフォーム・ワンのシステムの運用・保守担当のエンジニアです。 保守の仕事に関わると、 ユーザからのお問い合わせだったり、監視アラートによる検知から システムを調査することがあります。 ログとソースコードを見て、不具合を特定し改修する。 すぐできればカッコいいですが、 「本番環境に反映して別のエ …

GoogleスプレッドシートからTreasureDataへデータを取り込む

AudienceOneの開発を担当しています。skryoです。 またまたTreasureDataネタですが、今回はGoogleスプレッドシートからGoogleAppsScriptを使ってTreasureDataへデータを取り込む手順を紹介したいと思います。 なぜ? Googleスプレッドシート上でマ …

Qiita Team API と Google Spread Sheet でチーム日報を生成する

チーム日報を活用する MarketOne 開発チームでは複数拠点に分かれての開発を行っています。リモート開発が中心となると口頭でのコミュニケーションに限界があるため、テキストベースのコミュニケーションの比重が高い状態にあります。 チケットシステムやソースコード管理ツール上の議論はもちろんおこなってい …

slack×Nagiosでアラートをプッシュ通知

DACではサーバ・NW機器のリソースの監視に「Nagios」を利用してます。 監視ホストも数百台規模で増え続けており、アラート検知が非常に重要な課題となってきています。 メールの通知では、各MLを通知先に設定して、フィルタ分けして…と何かと面倒ですね。 そこで「slackへアラート内容を …