Furyu
[フリュー公式]

Tech Blog

フリュー株式会社の技術ブログです

2014年11月10日

sakata

VisualVMをリモート接続しよう(Firewall越しに)

Hello World! ソーシャルネットワーク事業部の、jyukutyoこと阪田です。

Firewall越しにVisualVMを接続しようとして少しハマったことを思い出し、記事にしよう!と思い立ちました。 VisualVMについてまとまっているWebページは多くあります。しかしリモート接続そしてFirewall越しとなるとなかなかまとまったものはありませんでした。お役に立てれば幸いです。

VisualVMとは

Java VisualVMとは「Java VisualVM は、Java Virtual Machine (JVM) 上で実行されている Java アプリケーションに関する詳細情報を表示したり、それらのアプリケーションのトラブルシューティングやプロファイリングを行なったりするためのビジュアルインタフェースを提供するツール」です(http://docs.oracle.com/javase/jp/7/technotes/guides/visualvm/)。

http://visualvm.java.net/からダウンロードして使用することもできますが、Java SE Version 6, Update 7から標準で付属しています。そのため、JAVA_HOME/binにパスが通っていれば「jvisualvm」というコマンドを実行するだけでVisualVMを起動できます。

VisualVMによって、リモートサーバ上で実行しているJavaアプリケーション(TomcatなどのサーブレットコンテナやOracle WebLogic Serverなどのアプリケーションサーバを含む)の情報を取得することができます。具体的にはCPU使用率やヒープ、Metaspace(PermGen)、クラスやスレッドなどの情報が取得できます。

Firewall越しにリモート接続

さて、VisualVMについてはこれぐらいにして、本題に入ります。

Firewallがあり特定のポートしか開いていない場合、オプションでポート番号を指定して接続できる…わけですが、すんなりいきません。

ここでは9999ポートが開いているとして、上記のようにポート番号を指定しました。しかしVisualVMでこのポート指定しても、接続できません。VisualVMはRMIでJVMに接続するのですが、実はRMIは2つのポートを利用するのです。

RMIレジストリポートとRMIサーバポート

RMIのクライアントは、まずRMIレジストリポートへ接続します。その後レジストリからスタブが取り出され、そのポートがサーバポートとして実際の通信に使われます。以前はそのポートは不明で、指定することができませんでした。指定できないためFirewall環境下ではRMI接続ができず、VisualVMは利用できません。しかしJava SE Version 7, Update 4以降は、オプションでRMIサーバポートを指定できるようになりました。

-Dcom.sun.management.jmxremote.rmi.port=9999

先ほどのオプションと合わせて、すべて指定すればFirewall越しにVisualVMに接続できます!

なお、com.sun.management.jmxremote.portcom.sun.management.jmxremote.rmi.portにまったく同じポートを指定できます。ポートが1つ開いてさえいれば、大丈夫です!

ただし、インターネット上に公開しているサーバならセキュリティ上の観点からcom.sun.management.jmxremote.authenticate=trueとし(またはこのオプションを指定せず、デフォルトのtrueとして使用し)、パスワードファイルを作成してcom.sun.management.jmxremote.password.fileオプションでパスワードファイルへのパスを指定しましょう。これで接続にユーザ名とパスワードが必要となります。

VisualVM起動!

さあ、今すぐjvisualvmコマンドを実行して、VisualVMを起動しましょう! スクリーンショット 2014-11-04 19.06.11

使い方は簡単です。画面上のボタンを押せば、CPU使用率やヒープ、Metaspace(PermGen)、クラスやスレッドなどの情報を数値やグラフを見ることができます。

参考URL

Tunneling JMX in the 7u4 JDK | Marcus Hirt http://hirt.se/blog/?p=289


2014年11月4日

kunihira

Vagrantで簡単Ansible実行環境を配布する

こんにちは。 最近、英語の勉強にハマっている国平です。

少し前の話になりますが、Bashに脆弱性が見つかった際にみなさまどのように対応されたでしょうか? 私の部署ではサーバのBashのバージョンアップを1台ずつログインして手動で実行していました。

このバージョンアップ作業自体は1コマンドで完了するのですが、サーバ台数が多く1台ずつに順にsshでログインしコマンドを実行するのは結構な手間が掛かりました。

そこでAnsibleを使って複数のサーバの状態をまとめて変更できるようにしました。

Ansibleによるサーバの管理自体は資料も多くすぐに実行出来ました。 以前、このブログでAnsibleを取り上げたときには参考にできる情報が少なかったのですが、 現在では非常に多くの優れた資料が公開されていますので、Ansibleを利用する事自体はそれほど難しくないかと思います。

しかし、次の課題としてチーム全員がAnsibleを利用できるようにしなくてはいけません。 Ansibleの利用に集中できるように簡単にAnsibleの実行環境を構築できるような仕組みづくりを目指して、 Vagrantを利用して実行環境も含めてGitで管理し、配布できるようにしました。

今回のポイント

今回の課題は、チーム全員が簡単にAnsible実行環境を使えるようにするということです。 AnsibleのPlaybook自体はGitでバージョン管理出来ているので、同様にGitで実行環境も管理できると、 便利で配布がしやすくなりそうです。

そのため、今回はVagrantの設定ファイルをPlaybookとセットでGit管理し、Vagrantを実行するだけで、 Ansibleがインストール済みで、Playbookも利用できる仮想マシンにアクセスできるような仕組みづくりを行いました。

Ansibleとは

Ansibleはリモートマシンのあるべき状態をPlaybookというファイルに記述し、実行する事で、リモートマシンの環境を整えるツールです。 以前にもこのブログの記事でも取り上げました。

最近では急速に普及が進んで、利用するための情報も多く公開されていますし、電子書籍ですが入門Ansibleという本も公開されています。

Vagrantとは

Vagrantは仮想環境をコマンドラインから利用するツールです。 VirtualBoxをコマンドラインから利用する事ができる他、ネット上で公開されているBoxを取得して実行したり、 仮想マシンの起動時にShellスクリプトやChef、Puppetなどを利用してプロビジョニングを行う事も出来ます。

こういった設定を全てVagrantfileにRubyのDSLとして記述する事ができるので、Vagrantfileとプロビジョニングに使うファイルをGitにコミットしておけば、どこからでも同一状態の仮想マシンを利用する事が出来ます。

今回の方針

今回は、PlaybookとVagrantfile、そして仮想マシンのプロビジョニングファイルを1つのGitリポジトリにまとめてコミットしておきます。 プロビジョニングには、チームメンバーが誰でも読み書きできる前提で、Shellスクリプトを利用することにしました。

今回作成したGitリポジトリのサンプルはこちらです。

仮想環境構築のポイント

Vagrantで仮想環境を複数人で利用するためのポイントは下記の3点です。

  • Boxを自動的に取得するようにする
  • 仮想マシンを起動したら自動でPlaybookを実行できるようにする

Boxを自動的に取得するようにする

Vagrantでは仮想マシンの起動の際にベースとなるイメージファイルをBoxと呼びます。 最初にVagrantを利用する際にはBoxを取得して利用するのですが、 チームメンバーが個々にBoxを取得するのも面倒です。

なので、全員がおなじBoxを利用できるようにVagrantfile内で config.vm.box_url を設定しておきます。 これにより、Vagrantを実行するホストマシンに config.vm.box で指定したBoxが存在しなければ、指定したURLからBoxを取得して起動するようになります。 サンプルではCentOS6のBoxを取得して、furyu_blog_sample という名前で利用できるように設定しています。

仮想マシンを起動したら自動でPlaybookを実行できるようにする

この処理には2つのポイントがあります。

ホストのディレクトリを同期

まずは、仮想マシンとホストマシンのディレクトリを同期する設定をします。 Vagrantfileで config.vm.synced_folder "<HOST_DIR>", "<VM_PATH>" を設定すると、ホストマシンの指定したディレクトリを、仮想マシンから参照できるようになります。

サンプルで公開しているリポジトリの場合ですと、下記のように設定する事でサンプルリポジトリ全体を仮想マシン上では /playbook ディレクトリとして扱う事が出来ます。

仮想マシンをShellプロビジョニング

もう一つのポイントは、Vagrantのプロビジョニング機能を利用して仮想マシンにAnsibleやその実行のために必要なツールをインストールすることです。

Vagrantでは前述の通り仮想マシンの新規起動時にシェルスクリプトなどの実行をさせる事ができます。 なので、先ほど同期したリポジトリ内に、Ansibleのインストールなどを行う処理をまとめたシェルスクリプトを用意しておいて、実行するようにします。

今回は、リポジトリ内のvagrantディレクトリに置いてある、bootstrap.shを実行するようにします。

bootstrap.shは下記のような内容になっています。

Ansibleを実行する

サンプルリポジトリを使ってAnsibleを実行してみます。 なお、今回仮想マシンに利用しているCentOS6では、Ansibleが実行時にsshを自動的には利用してくれないので、-c オプションをつけて明示的にsshを利用するようにしています。 このサンプルは、Vagrantが利用できる事が前提となっています。

上記のコマンドを順に実行すると仮想マシンが立ち上がり、接続し、そしてplaybookが実行出来ます。

まとめ

今回の記事ではAnsibleの実行環境をVagrantを利用して配布しました。 これによって、チームメンバー全員が簡単にAnsibleを利用する事ができます。 簡易ながらVagrantを用いてプロビジョニングする事で、 サーバ環境だけでなく、実行環境にもべき等性を持たせる事が出来ました。 これでチームメンバーのローカルマシンの設定の差に影響を受けずに作業する事ができます。

関連記事