IT関連

AS400/IBMi VirtualBoxとVagrantでMac開発環境を構築する

自宅でテレワークするのに、いちいち会社のPCにリモートして仕事をするのが奇妙なのでMac内に開発環境を作ろうと思います。

その備忘録です。

巷ではDockerが主流というか、現時点で使っていないやつは無能以下のゴミ扱いらしいですね。

でもDockerを勉強してもいまいち解らないのです。

おそらくですが、VagrantやBOXの概念とかプロビジョニングを知らずにDockerは理解しようとすることに無理があるのかも。

ということで、勉強がてらVagrantで作ってみます。

 

Vagrantの基礎的なものはこちらを参照ください。VirtualBoxとVagrantはインストール済として始めます。

Vagrant VirtualBoxのメモ

 

IBMのサイトからiaccessのドライバをダウンロードする

取得方法や取得物は若干変わっているけど、似たようなものなのでやり方は下記を参照。

AS400/IBMi 無料でWeb化 GUI化 オープン化 Linuxサーバ構築編 2/3

 

ログインしてダウンロードのメニューのEntitled Systems Supportから入る。

IBMiからIBM i Access Client Solutions Linux - APを選択して取得すればOK。

たぶんダウンロードした圧縮ファイルを解答すればIBM_i_Access_Client_Solutions_-_Linux_AP_LCD8_2012_14という名前のディレクトリのはず。

必要なのはその中にある、x86_64ディレクトリの中の「ibm-iaccess-1.1.0.14-1.0.x86_64.rpm」というファイル。

ibm-iaccess-1.1.0.14-1.0.x86_64.rpmです。

これを後で使います。

 

BOXを作る

ボックスイメージをネットから取得する。

今回はいままでの開発環境と同じCentOS7を採用する。

  1. Vagrantbox.esへアクセスする
  2. CentOS 7.2 x64のところにあるURLをコピーする
  3. Macからターミナルを開く
vagrant box add <自分が判別しやすいBOXの名前> <先程コピーしたURL>

私の場合はこんな感じ
vagrant box add centOS72 https://github.com/CommanderK5/packer-centos-template/releases/download/0.7.2/vagrant-centos-7.2.box

BOXは環境の元になるOSイメージなので、BOXの名前にはibmなどは付けずcentOS72にする。

 

ちゃんとBOXがインストール(厳密にはインストールとは言わない)されているか確認する。

vagrant box list

centOS72が一覧にあればOK。

 

Vagrant開発環境を置くディレクトリを作る

今回は自分のユーザディレクトリの直下に作ることにする。

またVagrantで作る環境は将来複数作るかもしれないので、それをまとめるVagrantディレクトリも作ります。

 

Macのターミナルから、まずログインユーザのディレクトリに移動する

cd ~

Vagrantで作る環境をまとめるVagrantディレクトリを作る

mkdir Vagrant

Vagrantディレクトリに移動する

cd Vagrant

今回の開発環境を置くディレクトリを作成する。今回はibmi接続専用なので、名前をcentOS7ibmiにする。

mkdir centOS7ibmi

そのディレクトリに移動する

cd centOS72ibmi

 

仮想マシンの初期設定をする

インストールしたBOXイメージcentOS72を元に仮想マシンを作る。

前回からの話の流れでいくと、現在のディレクトリはcentOS72ibmiのはずです。

 

BOXイメージ「centOS72」を元に初期設定(init)をする

vagrant init centOS72

 

初期設定したらディレクトリ内にVagrantfileができているのでそれをエディタで開く

vi Vagrantfile

 

vimエディタ内にて

[行番号を表示する]
:set nu

[35行目にあるコメントアウトの#を外す]
config.vm.network "private_network", ip: "192.168.33.10"

[保存して終了]
:wq

 

これで192.168.33.10で仮想マシンに接続できるようになる。

複数仮想マシンを作るときは、10を11にするなどすればいいと思う。

 

iaccessのドライバをディレクトリに移動する

取得済のファイル「ibm-iaccess-1.1.0.14-1.0.x86_64.rpm」を、centOS72ibmiディレクトリの中に移動する。

これはFinder操作でドラッグアンドドロップすればOK。

このrpmパッケージは後で使う。

 

仮想マシンを起動する

仮想マシンを起動する

vagrant up

 

 vagrant-vbguestをインストールしておく

以後、仮想マシンを再起動すると、後述する「マウント」において不具合が起こる。

これはMac側と仮想マシン側のマウントを司るGuestAdditionsという機能のバージョンが合致していないことが原因らしい。

ちなみにバージョンが合致しないケースは、yum updateを行った後に起き、yum updateを行わなかったときは起きなかった。

ゆえに、それを解消してくれるプラグインをインストールしておく。

[vagrant-vbguestというバージョンを更新してくれるプラグインインストールする]
vagrant plugin install vagrant-vbguest

 

バージョンの確認や更新は仮想マシンを立ち上げたときに自動的に行ってくれる。

 

手動で更新する場合は下記を使うが、基本的に使わないしやらなくていい。

[手動でバージョンの更新をする場合(使わない)]
vagrant vbguest

 

仮想マシンにSSHでアクセスする

IDやパスワードは不要。これだけで仮想マシンのターミナルを操作できる。

vagrant ssh

 

初期時点の状況

  • HTTPサーバは未導入
  • PHPは未導入
  • SELinuxは未稼働
  • FTPサーバソフトは未導入
  • iAccessドライバは未導入

 

タイムゾーン設定をしておく

タイムゾーンをアジア東京にする。

$ sudo timedatectl set-timezone Asia/Tokyo

 

念のため、現在のタイムゾーンを確認するときは下記にて。

$ timedatectl

 

HTTPDやPHPなど必要なものをインストールする

ここからはSSHを利用して仮想マシン内の操作になる。

まず、最初にPHPやWebサーバのHTTPDをインストールする。

なお、普通にyum installしただけではPHPはバージョン5.4がインストールされてしまうので、最新の7.Xがインストールされるようremiリポジトリを追加する。

 

まず最初にyum updateを行っておく。10分近くかかるので注意。

[Vagrant+Virtualboxの場合、yum updateはGPGの鍵でエラーが出るので、出ないよう前準備]
$ curl -L https://yum.puppetlabs.com/RPM-GPG-KEY-puppet -o /tmp/RPM-GPG-KEY-puppet
$ gpg --with-fingerprint "/tmp/RPM-GPG-KEY-puppet"
$ sudo cp /tmp/RPM-GPG-KEY-puppet /etc/pki/rpm-gpg/RPM-GPG-KEY-puppetlabs-PC1

[インストール済のパッケージのバージョンを最新にアップデートする]
$ sudo yum -y update

 

必要なもの諸々をインストールする。

[yumのremiリポジトリを追加する]
$ sudo yum -y install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

[HTTPサーバやphp7.3などその他必要なものをインストールする]
$ sudo yum install -y --enablerepo=remi,remi-php73 httpd php php-mbstring php-odbc php-pdo php-mysqlnd php-xml php-pecl-zip

[必要であればこの辺も]
$ sudo yum install -y --enablerepo=remi,remi-php73 php-devel php-gd

 

これでhttpdとPHPやその他がインストールされる。

ちなみにhttpdのバージョンは2.4.6で、PHPのバージョンは7.3のはず。

 

httpdサーバの設定をする

ブラウザから192.168.33.10にアクセスしても、デフォルトだとindex.htmlファイルしか見てくれないので、index.phpファイルも見るように設定する。

 

httpdの設定ファイルhttpd.confをエディタで開く

$ sudo vi /etc/httpd/conf/httpd.conf

 

Vimエディタ内

[行番号を表示する]
:set nu

[164行目に追記する]
DirectoryIndex index.html index.php

[保存して終了]
:wq

 

再起動してもWebサーバが起動するように設定しておく。

CentOS6ではchkconfigで行うがCentOS7ではsystemctlを使うらしい。

$ sudo systemctl enable httpd.service

 

Webサーバを起動する

$ sudo systemctl start httpd

 

ブラウザから「http://192.168.33.10」へアクセスしてページが表示されるか確認する。

ドキュメントルートは/var/www/htmlで、/var/www/html内にファイルはないので、ApacheのWelcome画面が表示されるはず。

 

iaccessドライバーをインストールする

ドライバーファイルは序盤にVagrant/centOS72ibmiの仮想マシンがあるディレクトリに移動しました。

しかしこれはあくまでMac側のディレクトリであり、仮想サーバの中ではありません。

FTPなどを使って仮想サーバの中に入れなければファイルを触ることができないと思いきや、Vagrantにはそれを解決する仕組みがあるみたい。

これは一番最初にリンクしたVagrantの記事にありますが、Mac側のcentOS72ibmiディレクトリの中身は、仮想サーバ側の/vagrant内にマウントされるという仕様のようです。

 

ゆえに、ドライバーインストールはこちら。

[iaccessドライバーのある/vagrantに移動する]
$ cd /vagrant

[iaccessドライバーをインストールする]
sudo yum install -y ibm-iaccess-1.1.0.14-1.0.x86_64.rpm

 

iaccessドライバーをインストールすると

iaccessドライバーをインストールするとどうなるのか。

まず/opt直下にドライバー系のディレクトリやファイル群がたくさんできる。

そして/etc/odbcinst.iniに

[IBM i Access ODBC Driver]
[IBM i Access ODBC Driver 64-bit]

の項目が追加されます。

 

ibmiと疎通テストをしておく

/opt直下のディレクトリに移動してibmi用のpingツールを実行する。

[iaccessのディレクトリに移動]
$ cd /opt/ibm/iaccess/bin

[pingを実行する]
$ ./cwbping 128.1.10.1

数行返って来れば疎通確認完了。

 

odbc.iniを作る

odbc.iniとはLinux環境全てのODBC DSNの定義を格納する構成ファイルのこと。

これはiaccessをインストールしても作られないので自前で作る。

 

odbc.iniファイルを作る

$ sudo vi /etc/odbc.ini

中身は

[ibmi]
Description = IBM i
Driver = IBM i Access ODBC Driver 64-bit
System = <ibmiのIPアドレス>
CCSID = 943

と書く。

System = ibmiにしてhostsファイルに登録してもOK。

 

index.phpを作る

最後にHTMLとPHPのコードですね。

これを/var/www/htmlの中にindex.phpという名前で作ります。

 

Vimエディタでindex.phpを作りながら開く。

$ sudo vi /var/www/html/index.php

内容はこんな感じ。

<!DOCTYPE html>

<html lang="ja">

<head>
	<meta charset="utf-8">
	<title>ODBCテスト</title>
</head>

<body>

	<!-- ▼ビジネスロジック -->
	<?php

	// データベース接続情報
	$dsn = "odbc:ibmi";
	$usr = "ログインアイディー";
	$passwd = "パスワード";

	// ▼データベース接続を試みる
	try {

		$pdo = new PDO($dsn,$usr,$passwd);

	} catch (PDOException $e){

		die("接続エラー:{$e->getMessage()}");

	}
	// ▲データベース接続を試みる

	// SQL文組み立て
	$SQL = "エスキューエルブン";

	// テーブル取得
	$st = $pdo->query($SQL);

	?>
	<!-- ▲ビジネスロジック -->

	<!-- ▼HTML部 -->
	<h1>テーブル名</h1>

	<!-- ▼テーブル -->
	<table border="1">

		<!-- ▼テーブルヘッダー -->
		<thead>
			<tr>
				<th>コード</th>
				<th>名前</th>
			</tr>
		</thead>
		<!-- ▲テーブルヘッダー -->

		<!-- ▼テーブルボディ -->
		<tbody>

			<!-- ▼レコードを読んで<tr>を書き出す -->
			<?php while($row = $st->fetch()){ ?>

				<tr>
					<!-- 1バイト文字はそのまま書き出し -->
					<td><?= $row["カラムメイ"]; ?></td>
					<!-- 2バイト文字はShift-JISからUTF-8へ変換 -->
					<td><?= trim(mb_convert_encoding($row["カラムメイ"],"UTF-8","SJIS-win")); ?></td>
				</tr>

			<?php } ?>
			<!-- ▲レコードを読んで<tr>を書き出す -->

		</tbody>
		<!-- ▲テーブルボディ -->

	</table>
	<!-- ▲テーブル -->

</body>
<!-- ▲HTML部 -->

</html>
  • ログインアイディー
  • パスワード
  • エスキューエルブン
  • カラムメイ(2箇所)

の5つを直す。

 

ブラウザからアクセスする

後はブラウザから192.168.33.10へアクセスする。

index.phpで表示しようとしたSQL文の内容が表示されれば完成。

 

作られたindex.phpの所有権はrootになっているが、他ユーザーでも実行できるのでちゃんと見れるはずです。

おつかれさまでした。

 

補足

環境設定をした上での気付きなので、無視してもOKです。

odbcinst.iniについて

iAccessをインストールする前のodbcinst.iniの中身。ibmiの文字はありません。

[IBM i Access ODBC Driver]
[IBM i Access ODBC Driver 64-bit]

はiAccessをインストールすれば登録されます。実証済み。

# Setup from the unixODBC package
[PostgreSQL]
Description	= ODBC for PostgreSQL
Driver		= /usr/lib/psqlodbcw.so
Setup		= /usr/lib/libodbcpsqlS.so
Driver64	= /usr/lib64/psqlodbcw.so
Setup64		= /usr/lib64/libodbcpsqlS.so
FileUsage	= 1

# Driver from the mysql-connector-odbc package
# Setup from the unixODBC package
[MySQL]
Description	= ODBC for MySQL
Driver		= /usr/lib/libmyodbc5.so
Setup		= /usr/lib/libodbcmyS.so
Driver64	= /usr/lib64/libmyodbc5.so
Setup64		= /usr/lib64/libodbcmyS.so
FileUsage	= 1

 

/opt/ibm/iaccess/について

cwbpingで疎通確認をしたときに使ったもの。

これもiAccessをインストールするまではありませんでした。

インストールすれば追加されました。実証済み。

 

isqlはいつ入るのか

isqlは導入当初はありませんでした。

一つ一つ入れてチェックしたところ、php-odbcをインストールした後にisqlが使えるようになった。

isqlを実行したときにunixODBCと表示されるので、odbcの機能みたい。

 

データベース接続の宛先

PHPソース内に

$dsn = "odbc:ibmi";

としたのは、odbcを使って、ibmiに接続するという意味。

 

このibmiというのは、odbc.iniで指定した

[ibmi]
Description = IBM i
Driver = IBM i Access ODBC Driver 64-bit
System = <ibmiのIPアドレス>
CCSID = 943

この[ibmi]みたい。

 

ただし、/etc/hostsファイルにIPアドレスとibmiを対にして書き込んでも大丈夫だった。

そのときはSystem = ibmiにした。

 

iAccessドライバーは必要なのか

色々試行錯誤してみたけど、結論としてiAccessドライバーがなければIBMiからデータを取得することはできないっぽい。

-IT関連
-, , ,

© 2021 なんで勉強するの