Chefを使ってOracle製品をインストールするための環境を準備してみた


# 概要
Oracle DatabaseやWebLogic ServerといったOracle製品をインストールしようとした時に、次のような事で悩んだりした事がないでしょうか。

- どこのディレクトリにインストールしようかな
- ディレクトリの階層構造はどうしようかな
- ディレクトリの権限はどうしたらいいかな
- 前提パッケージってなんだったっけ
- システムリソースの制限値はどうしよう

マニュアルにも記載があったりしますが、何度も構成するのであればChefを使って定義しておけば便利ですよね。
というわけで、作ってみました。

# Optimal Flexible Architecture（OFA）
ところで、ディレクトリ構成についてなのですが__Optimal Flexible Architecture（OFA）__というものを聞いた事があるでしょうか。

実は、OracleはOracle製品を配置するために推奨される構成のガイドラインを出していたのです。それが、__Optimal Flexible Architecture（OFA）__です。

Oracle Databaseのインストールマニュアルにも次のようなセクションがあります。
- __[Overview of the Optimal Flexible Architecture Standard](https://docs.oracle.com/database/121/LADBI/appendix_ofa.htm#i633068)__

## OFAの目的
以下の目的でOFAによるガイドラインを定めています

- 大量のソフトウェアの構成
  - デバイスのボトルネックとパフォーマンス低下を防止するため，複雑な大型ソフトウェアやデータを構成
- 定期的な管理タスクの簡略化
    - ソフトウェアとデータのバックアップなど，日常の管理作業を容易化
- 複数のバージョンや環境の切り替え
- データベース拡張の適切な管理
- リソース競合の最小化支援
    - 断片化部分を分離してリソースの競合を最小

# Chefを使ってやりたい事
Oracle製品をインストールする度にディレクトリ構成決めたり、ユーザー/グループを作成したり、前提パッケージを入れたりなどインストール作業の事前作業をするのは大変です。
そこで、Chefを使って最低限やっておく事を定型化しておきます。

## 今回作成するRecipe
- ユーザ/グループの作成
- OFAに従ったディレクトリの作成
- 前提パッケージの導入（特にOracle DBの場合）
- ulimitの設定（特にOracle DBの場合）
- カーネル・パラメータの設定（特にOracle DBの場合）
- 環境変数の設定

# Recipe1. ユーザーの作成
Oracle製品をインストールまた運用する際のユーザーとグループを作成します。

インストールマニュアルの次の場所に必要なユーザーとグループに関する記述があります。
- __[Oracle Databaseのためのユーザー、グループおよび環境の構成](http://docs.oracle.com/cd/E57425_01/121/LADBI/usr_grps.htm#BACFCAHC)__

|名称|グループ名|役割|
|:---:|:---|---|
|oinstall|Oracleインベントリ・グループ|Oracle Universal InstallerによりoraInst.locファイルが作成されます。このファイルでは、Oracleインベントリ・グループ名(通常はoinstall)およびOracleインベントリ・ディレクトリのパスが識別|
|dba|Oracle管理権限グループ|データベース管理権限(SYSDBA権限)を持つオペレーティング・システムのユーザー・アカウントが識別|
|oper|OSOPERグループ|データベースを起動および停止するためのデータベース管理権限の一部(SYSOPER権限)を持つ別個のオペレーティング・システム・ユーザー・グループ|
|backupdba|OSBACKUPDBAグループ|オペレーティング・システム・ユーザーの別のグループにバックアップおよびリカバリ関連権限の一部(SYSBACKUP権限)を付与|
|dgdba|OSDGDBAグループ|オペレーティング・システム・ユーザーの別のグループにOracle Data Guardを管理および監視する権限の一部(SYSDG権限)を付与|
|kmdba|OSKMDBAグループ|オペレーティング・システム・ユーザーの別のグループに、Oracle Wallet Managerの管理など暗号化鍵を管理権限の一部(SYSKM権限)を付与|


それを元にユーザーとグループのRecipeを作ります。

- グループ

```recipes/default.rb
groups = { 
  "oinstall" => "54321",
  "dba" => "54322",
  "backupdba" => "54323",
  "oper" => "54324",
  "dgdba" => "54325",
  "kmdba" => "54326"
}
groups.each do |name, gid|
  group name do
    gid gid
  end
end
```

- ユーザー

```recipes/default.rb
user "oracle" do
  uid 1200
  gid "oinstall"
  supports :manage_home => true
  home "/home/oracle"
  password "ハッシュ化したパスワード"
end
groups.each_key do |name|
  group name do
    members "oracle"
    action :modify
  end
end
```

# Recipe2. ディレクトリの作成
OFAに従うようにディレクトリを作っていきます。

|ディレクトリ構造|説明|
|---|---|
|/u01|ユーザー・データ・ディレクトリ|
|/u01/app|ユーザーのアプリケーション・ソフトウェア・ディレクトリ|
|/u01/app/oracle|Oracleベース・ディレクトリ|
|/u01/app/oracle/product|ディストリビューション・ファイル|
|/u01/app/oracle/config|WebLogicの構成情報|
|/u01/app/oracle/config/domains|WebLogicの各ドメイン|
|/u01/app/oracle/config/applications|WebLogicの各アプリケーション|
|/u01/app/oraInventory|インベントリ・ディレクトリ|

```recipes/default.rb
dirs = [
  "/u01",
  "/u01/app",
  "/u01/app/oracle",
  "/u01/app/oracle/product",
  "/u01/app/oracle/config",
  "/u01/app/oracle/config/domains",
  "/u01/app/oracle/config/applications",
  "/u01/app/oraInventory"
]
dirs.each do |dir|
  directory dir do
    mode 00755
    owner "oracle"
    group "oinstall"
  end
end
```

# Recipe3. 前提パッケージのインストール
Oracle DBをインストールする場合、以下の前提パッケージが必要となります。

[(参照)x86-64用のサポートされるOracle Linux 7およびRed Hat Enterprise Linux 7ディストリビューション](http://docs.oracle.com/cd/E57425_01/121/LADBI/pre_install.htm#BABFDBFJ)

- binutils-2.23.52.0.1-12.el7.x86_64 
- compat-libcap1-1.10-3.el7.x86_64 
- gcc-4.8.2-3.el7.x86_64 
- gcc-c++-4.8.2-3.el7.x86_64 
- glibc-2.17-36.el7.i686 
- glibc-2.17-36.el7.x86_64 
- glibc-devel-2.17-36.el7.i686 
- glibc-devel-2.17-36.el7.x86_64 
- ksh
- libaio-0.3.109-9.el7.i686 
- libaio-0.3.109-9.el7.x86_64 
- libaio-devel-0.3.109-9.el7.i686 
- libaio-devel-0.3.109-9.el7.x86_64 
- libgcc-4.8.2-3.el7.i686 
- libgcc-4.8.2-3.el7.x86_64 
- libstdc++-4.8.2-3.el7.i686 
- libstdc++-4.8.2-3.el7.x86_64 
- libstdc++-devel-4.8.2-3.el7.i686 
- libstdc++-devel-4.8.2-3.el7.x86_64 
- libXi-1.7.2-1.el7.i686 
- libXi-1.7.2-1.el7.x86_64 
- libXtst-1.2.2-1.el7.i686 
- libXtst-1.2.2-1.el7.x86_64 
- make-3.82-19.el7.x86_64 
- sysstat-10.1.5-1.el7.x86_64 

とりあえず、最新をいれておく方針で次のようにしました。

```recipes/packages.rb
pkgs = [
  "oracle-rdbms-server-12cR1-preinstall",
  "binutils",
  "compat-libcap1",
  "compat-libstdc++-33",
  "gcc",
  "gcc-c++",
  "glibc",
  "glibc-devel",
  "ksh",
  "libgcc",
  "libstdc++",
  "libstdc++-devel",
  "libaio",
  "libaio-devel",
  "libXext",
  "libXtst",
  "libX11",
  "libXau",
  "libxcb",
  "libXi",
  "make",
  "sysstat"
]
pkgs.each do |pkg|
  package pkg do
    action :install
  end
end
```

# Recipe4. その他パラメータなど
カーネルパラメータなどその他設定する必要があるものは、事前に設定ファイルを用意しておき置き換えるようにしています。

# まとめ
一度このようにインストール環境を整えるレシピを用意しておけば、何か製品をインストールするのも楽になりますね

-[今回のレシピ：https://github.com/shinyay/chef-oracle-env/tree/publish_20160606](https://github.com/shinyay/chef-oracle-env/tree/publish_20160606 "chef-oracle-env")