Ant scpタスク/sshexecタスク でリモート操作を自動化

職場のサーバ環境へWARファイルをリリースするにあたっては、

  • 1.WARファイル作成(ローカルPC)
  • 2.サーバへWARファイルをアップロード(ローカル→リモート)
  • 3.サーバ起動停止及びリリース作業(サーバSTOP→配置→サーバSTART)

という、例によっての手順を踏んでいる訳なのですが、現在2.と3.に関しては手作業にて進めています。
これが、結構面倒と言えば面倒。手順としてはそんな大した事はないコマンドな訳なのですが、毎回同じでかったるいと言えばかったるい。

1〜3を全自動化出来ないものかしら…と調べてみたら良さげなAntタスクがありました。『scp』と『sshexec』タスクです。前者はファイル転送、後者はリモート環境での操作が行えるタスク。

どちらのタスクも、実行にはライブラリファイルが必要となります。

入手したファイル(jsch-0.1.44.jar)をAnt実行ライブラリパスに追加すれば、使えるようになります。今回はコマンドプロンプトからAnt実行する形としたので、ANT_HOME/lib 配下にコピーしときました。

難しいことをしなければ、至極シンプルに以下の形式でファイルアップロードが完了。

<scp
    file="(アップロードするファイルのパス)"
    todir="(ユーザ名):(パスワード)@(サーバホストIP):(パス)"
    trust="yes"/>

また、以下の形式でサーバに対しリモートでコマンドが実行出来ました。(以下の場合はpwdコマンドを実行する場合)

<sshexec
    host="(サーバのホストIP)"
    username="(実行ユーザ名)"
    password="(実行ユーザパスワード)"
    command="pwd" trust="yes"/>

sshexecタスクでは幾つか小っちゃな壁にぶつかりましたので忘れないようにメモ。一つは『sudoコマンドを使った処理』。

rootユーザで実行する(出来る)場合はそこまで問題無いのでしょうが、コマンドを試してた環境は自宅のUbuntuサーバ。『sudo xxxx』の形式でないと実行出来ない処理もありました。

例えば、普通に

<sshexec
    host="(サーバのホストIP)"
    username="(実行ユーザ名)"
    password="(実行ユーザ名のパスワード)"
    command="sudo service apache2 restart"
    trust="yes"/>

等と実行した場合、以下のようなメッセージが出て怒られてしまいます。

sudo: no tty present and no askpass program specified

このメッセージは以下のように、サーバの環境に原因がある模様。

/etc/sudoers の内容を変更し、以下の記事を参考に『パイプ』を使った形式で記述する事で実行が出来ました。

<sshexec
    host="(サーバのホストIP)"
    username="(実行ユーザ名)"
    password="(実行ユーザ名のパスワード)"
    command="echo '(rootパスワード)' | sudo service apache2 restart"
    trust="yes"/>

後は既存のAntタスクを色々組み合わせればやりたい事は実現出来そうかな〜?

2つ、気になった事というか、直面して解決出来なかった点が。

  • sshexecタスクで『cd』コマンドを実行しても移動してくれない
  • sshexecタスクで出力された結果の日本語出力が化ける

前者については、実行自体は何ら問題無いものの、pwdコマンドで位置を確認してみると同じ場所のまま。
後者については、コマンドプロンプト/PowerShellプロンプトの問題かなと思いchcpコマンドでutf-8(サーバ文字コード設定)に変えてみるもしっくり行かず、一部文字化けのまま。

ん〜、奥が深い。つかまだ足を踏み入れたばかりなので(自らは)浅いのも良いところだが。

その他参照: