Hyper-V上のWebサイト(Redmine, Jira)にホストPCのブラウザからアクセスする
Hyper-V上の仮想マシンにRedmineやJiraを構築したが、仮想マシン内のブラウザでは画面が狭いとか、コピー&ペースト出来ない等の課題があったので、Hyper-V上のWebサイトにホストPCのブラウザからアクセスする方法を調べました。
目的
Hyper-V上のWebサイトにホストPCのブラウザからアクセスする
環境
ホストPC:Windows 10 Pro 1803(April 2018 Update)*1
仮想マシンのIPアドレスを調べる
仮想マシン上で端末を開いてip addr show
を実行し、仮想ネットワーク上のIPアドレスを確認します。
このIPアドレスは、ホストPCの「既定のスイッチ」に割り当てられたアドレスと同じネットワークになります。
参考:
Windows 10 1709(Fall Creators Update/RS3) Hyper-V の NAPT 仮想スイッチ
ポートフォワーディングの設定を行う
Windowsのnetshコマンドを使用して、ホストPCへのアクセスを仮想マシンに転送する設定をします。
以下は、ホストPCの8080番ポートにアクセスすると、仮想マシンの80番ポートにつながる設定です。
listenaddressに「0.0.0.0」を指定しているため、ホストPCと同じLAN上にある他のPCからも「http://ホストPCのIPアドレス:8080/
」でアクセスできます。
netsh interface portproxy add v4tov4 listenport=8080 listenaddress=0.0.0.0 connectport=80 connectaddress=仮想マシンのIPアドレス
参考:
WindowsでVMへポート転送するときのメモ | hasegawayosuke's blog
仮想マシン上のファイアウォールを停止する
80番ポートのみを通すようにファイアウォールを設定すれば良いのですが、検証用途なのでファイアウォールが起動している場合は停止して、OS起動時にも起動しないようにします。
起動しているかどうか確認する
systemctl status firewalld
ファイアウォールを停止する
systemctl stop firewalld
OS起動時に起動しないようにする
systemctl disable firewalld
これでホストPCのブラウザのURLに「http://localhost:8080/
」と打つことで、仮想マシン上のWebサイトにアクセスできるようになりました。
以上
*1:1709(Fall Creators Update)ならばOK
Hyper-V上にJiraを構築する
ヘルプデスク的な使い勝手を求めて、RedmineだけでなくJiraも検証することになったのでHyper-V上にJiraを構築する方法を調べました。
ちなみに前回の記事はこちら
目的
Hyper-VでCentOS 7を構築し、そこにJira Service Deskをインストールする
環境
前回と同じ
仮想マシンの作成
前回、ゲストOSとしてUbuntuを選択したので、今回はCentOS 7で構築してみました。
以下のサイトを参考にCentOS 7のDVD ISOイメージをダウンロード。前回と同様に「クイック作成」を使用してダウンロードしたISOファイルを選択してインストールを開始しました。
【初心者でもわかる】Linux CentOSのインストール方法まとめ
仮想マシンの再インストール
サイトに従ってインストールは完了しましたが、「ソフトウェアの選択」で「最小限のインストール」を選択したのと「ネットワークの設定」をスキップしてしまったため、GUIがインストールされず黒い画面が表示されてしまいました。
これではやはり不便だったので、再インストールをすることにしました。
仮想マシンの設定でブート順でDVDドライブを先頭にして、DVDドライブのメディアにISOファイルを設定して、仮想マシンを起動するとインストール画面が表示されました。
改めて「ソフトウェアの選択」で「GNOME Desktop」を選択し、「ネットワークの設定」を済ませた上でインストールしました。
Jira Service Deskインストール
Jira Service Deskは、公式ドキュメントに従えばインストールが出来ました。
ドキュメント内でsudoコマンドを使っていて、CentOS 7のインストール直後は一般ユーザでsudoコマンドが使えなかったので、使えるように登録しました。
Jira アプリケーションを Linux にインストールする - アトラシアン製品ドキュメント
以下のコマンドで実行権限を与え、インストーラを実行しました。
chmod a+x atlassian-servicedesk-X.X.X-x64.bin
Jiraは評価版ライセンスをAtlassianのサイトで作成するため、ブラウザ(Firefox)にホストPCと同じプロキシサーバを設定しました。
評価版ライセンスの作成は特に問題なく終了し、それなりに時間はかかるが画面の操作に従ってインストールは完了しました。
Jira Service Deskへのアクセス
Firefoxから「http://localhost:8080/」を開くと、「http://localhost:8080/secure/WelcomeToJIRA.jsp」へリダイレクトされてJiraのログイン画面が表示されました。
以上。
Hyper-V上にRedmineを構築する
ヘルプデスク的な使い勝手を求めて、Redmineを検証することになったのでHyper-V上にRedmineを構築する方法を調べました。
- 目的
- 環境
- 仮想マシンの作成とホストOSのネットワーク遮断
- ネットワーク遮断の調査
- ネットワーク遮断の解決方法
- 仮想マシン(Ubuntu)からのインターネット接続
- Redmineインストール
- Redmineへのアクセス
目的
Hyper-VでUbuntu 18.04 LTS 日本語 Remixを構築し、そこにRedmine 3.4.0をインストールする
環境
今回構築するのは社内LAN上のPCで、プロキシの設定や不正接続検知等の対策が取られている
仮想マシンの作成とホストOSのネットワーク遮断
以前、別の環境でHyper-V上で仮想マシンを作成した時は、第1世代と第2世代のどちらを選ぶのか?とか設定があって面倒だなと感じていました。
もうちょっと簡単な方法は無いかと調べると、「クイック作成」という機能があることがわかったので、今回はこの方法で試すことにしました。
Windows 10のHyper-VでLinuxの仮想マシンを作成する:Tech TIPS - @IT
サイトの手順に従って、Ubuntuのインストールが完了したので、さっそく起動するといつの間にかホストPCのネットワークが遮断されている!!!
どうやら、前にHyper-Vを使用した時に作成した仮想スイッチをネットワークで選択したのがまずかったらしい。Ubuntu(仮想マシン)を終了した後、ネットワーク管理者にすいませんと謝ってネットワーク接続を復旧してもらい、対策を考えました。
ネットワーク遮断の調査
Hyper-Vの仮想スイッチについて良くわかっていなかったので、改めて調査しました。 以下のサイトを参考にして勉強。
Hyper-Vのネットワークを理解する -外部ネットワーク- | Windowsインフラ管理者への道
Hyper-Vのネットワークを理解する -内部ネットワーク,プライベートネットワーク- | Windowsインフラ管理者への道
コラム - Hyper-V の部屋 | 第5回 仮想環境とネットワーク|CTC教育サービス 研修/トレーニング
わかったのは、仮想スイッチは、仮想NICではないということ。仮想マシンのネットワークアダプタが仮想NICであり、仮想NICはホストPCのNICとは別物と扱われること。よって、仮想マシンを起動してネットワークに接続すると、LANケーブルを他のPCに差し替えて使用するのと同じ状態になってしまうのでした。
そんな訳で、「外部ネットワーク」の仮想スイッチは使用できない事がわかったけれど、このままでは仮想マシンはインターネットに接続できないため、対応方法をさらに調査しました。
ネットワーク遮断の解決方法
Windows 10 1709(Fall Creators Update)で、NATの役割をする仮想スイッチ(既定のスイッチ)が用意されたようなので、それを使用すると良さそうだとわかりました。
Windows 10 1709(Fall Creators Update/RS3) Hyper-V の NAPT 仮想スイッチ
「外部ネットワーク」のスイッチを削除して、イーサネットも「Hyper-V Extensible Virtual Switch」をやめて、設定をHyper-V導入前に戻しました。
その状態で、仮想マシンのネットワークアダプタの仮想スイッチ項目で「既定のスイッチ」を選択したところ、仮想マシンを起動してもホストPCのネットワークは遮断されなくなりました。
仮想マシン(Ubuntu)からのインターネット接続
次に仮想マシン(Ubuntu)からのインターネット接続を試みたが接続できず。ネットワーク設定は問題ないはずなので、プロキシ設定がされていないと想定。FirefoxでホストPCと同じプロキシサーバを指定して試したところ、インターネットへのアクセスに成功しました。
Redmineインストール
これでようやく、Redmineのインストール作業に移れます。Redmineのインストールには、bitnami Redmineを使用しました。Ubuntu上のFirefoxを使用して、直接ダウンロードしました。
端末を開き、以下のコマンドで実行権限を与え、rootユーザーになってインストーラを実行するとGUIなインストール画面が表示されたので指示に従ってインストールを完了しました。
chmod 755 bitnami-redmine-3.4.6-3-linux-installer.run
一応以下のサイトを参考にインストール先は「/opt/redmine」に変更しました。
bitnami Redmineをインストールする際に気をつけるただ1つのこと | ITソリューション
Redmineへのアクセス
インストールが完了したので、Firefoxから「http://localhost/」を開いてみたがアクセスできない。ファイアウォールでブロックされているかと思ったが、ファイアウォールは起動していませんでした。
調べてみると、GUIで操作できるツール(manager-linux-x64.run)が、インストールディレクトリ(/opt/redmine)にあることが分かったので、rootユーザーになって実行しました。
ツールで確認すると、ApacheもMySQLも停止していたので、「Start All」ボタンを押して両方とも起動したのを確認。
改めて「http://localhost/」を開くと、bitnamiのWelcomeページが表示されたので、画面の「Open Redmine」リンクをクリックするとRedmineのトップページが表示されました。
以上。
Excel読込でNPOIをEPPlusのように使うため拡張メソッドを作成した
なぜEPPlusを直接使わないかは、過去の記事を参照。
NPOIを直接使うと、同じようなコーディングを繰り返し行う事が結構あったので、拡張メソッドを作成しました。
EPPlusを参考にしたメソッドや、あると便利そうなメソッドを作りました。
public static class NPOIExtension { //GetCell("K21")のようにセルを指定できる public static ICell GetCell(this ISheet sheet, string cellRef) { var cellReference = new CellReference(cellRef); return sheet.GetRow(cellReference.Row).GetCell(cellReference.Col); } //GetCellRange("A3:F80")のようにセルの範囲を指定できる public static IList<ICell> GetCellRange(this ISheet sheet, string rangeRef) { var cells = new List<ICell>(); var cellRangeAddress = CellRangeAddress.ValueOf(rangeRef); for (var i = cellRangeAddress.FirstRow; i <= cellRangeAddress.LastRow; i++) { for (var j = cellRangeAddress.FirstColumn; j <= cellRangeAddress.LastColumn; j++) { var cell = sheet.GetRow(i).GetCell(j); cells.Add(cell); } } return cells; } //Cellの値が空の場合は、0ではなくnullを返し、それ以外は int を返すメソッド public static int? IntOrNull(this ICell cell) { switch (cell.CellType) { case CellType.Formula: case CellType.Numeric: //NumericCellValueプロパティの取得時に関数が評価される //関数の評価結果は、数値として扱う return Convert.ToInt32(cell.NumericCellValue); case CellType.Blank: return null; default: throw new ArgumentOutOfRangeException(); } } //Cellの値が空の場合は、0ではなくnullを返し、それ以外は decimal を返すメソッド public static decimal? DecimalOrNull(this ICell cell) { switch (cell.CellType) { case CellType.Formula: case CellType.Numeric: //NumericCellValueプロパティの取得時に関数が評価される //関数の評価結果は、数値として扱う return Convert.ToDecimal(cell.NumericCellValue); case CellType.Blank: return null; default: throw new ArgumentOutOfRangeException(); } } }
以上です。
(小ネタ)拡張メソッドを使用する場合も、Nullチェックは必要です!
IEnumerable
C#で変数の値がnullで落ちる場合に投げられる例外は、System.NullReferenceException である。
それで、今回投げられた例外を良く見てみると、System.ArgumentNullException であった。これは、引数がnullだったら投げる例外なので、つまり拡張メソッドの中でnullと判定されて投げられた例外だったということ。
基本的な事でした。拡張メソッドを使用する場合も、nullチェックは必要という事ですね。
はてなブログをhttps化しました。
id:kazuakix さんの以下の記事を読んで、id:shiba-yan さんや id:tanaka733 さんもhttps化をおすすめしていたので、当ブログもhttps化してみました。
サイドバーのカスタマイズ等はしていなかったので、ほとんど対応は不要だと思っていましたが、混在コンテンツ(Mixed Content)のブロックが発生しました。
開発者ツールで確認すると、bootstrap の css の参照先が、http になっているとのこと。
css の指定をした覚えは無いのでテーマだろうと予想して、公式テーマで似た感じのものに変更したところ、混在コンテンツの表示がなくなりました。
これでアクセスが増えるといいなあ。