自宅でテレワークするのに、いちいち会社のPCにリモートして仕事をするのが奇妙なのでMac内に開発環境を作ろうと思います。
その備忘録です。
巷ではDockerが主流というか、現時点で使っていないやつは無能以下のゴミ扱いらしいですね。
でもDockerを勉強してもいまいち解らないのです。
おそらくですが、VagrantやBOXの概念とかプロビジョニングを知らずにDockerは理解しようとすることに無理があるのかも。
ということで、勉強がてらVagrantで作ってみます。
Vagrantの基礎的なものはこちらを参照ください。VirtualBoxとVagrantはインストール済として始めます。
IBMのサイトからiaccessのドライバをダウンロードする
取得方法や取得物は若干変わっているけど、似たようなものなのでやり方は下記を参照。
ログインしてダウンロードのメニューの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を採用する。
- Vagrantbox.esへアクセスする
- CentOS 7.2 x64のところにあるURLをコピーする
- 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になっているが、他ユーザーでも実行できるのでちゃんと見れるはずです。
おつかれさまでした。
- IBMのサイトからiaccessのドライバをダウンロードする
- BOXを作る
- Vagrant開発環境を置くディレクトリを作る
- 仮想マシンの初期設定をする
- iaccessのドライバをディレクトリに移動する
- 仮想マシンを起動する
- vagrant-vbguestをインストールしておく
- 仮想マシンにSSHでアクセスする
- 初期時点の状況
- タイムゾーン設定をしておく
- HTTPDやPHPなど必要なものをインストールする
- httpdサーバの設定をする
- iaccessドライバーをインストールする
- iaccessドライバーをインストールすると
- ibmiと疎通テストをしておく
- odbc.iniを作る
- index.phpを作る
- ブラウザからアクセスする
- 補足
補足
環境設定をした上での気付きなので、無視しても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からデータを取得することはできないっぽい。
続きです。
コメント