Chefを使ってOracle Databaseをサイレント・インストールしてみた


# 概要
Oracle Data baseにはOracle Universal Installerを利用してGUIからのインストールと、GUIを利用しないサイレント・モード・インストールがあります。

- [Oracle Databaseのインストール](http://docs.oracle.com/cd/E57425_01/121/LADBI/inst_task.htm#BABBBHJH)

サイレント・インストールは、対話形式をとらずにバッチ処理としてインストール作業を実施します。そのため、画面表示ができないサーバ環境などには便利な機能です。
一方で、サイレント・インストールを実施するために、事前にレスポンスファイルと呼ばれるインストール時に入力する情報を事前に定義しておくファイルを作成する必要があります。

- [レスポンス・ファイルを使用したOracle Databaseのインストールおよび構成](http://docs.oracle.com/cd/E57425_01/121/LADBI/app_nonint.htm#BABFEECI)

# Chefを使ってやりたい事
通常であれば、レスポンスファイルを作成して任意の場所に配置し、Oracle Universal Installerでサイレント・インストールを実施する際にパラメータとして設定を行います。
そこで、Chefを利用してレスポンスファイルの作成、そして配置作業も、Oracle Databaseのインストールに併せて自動で実施できるようにします。

## 今回作成するRecipe
- Oracle Databaseのサイレント・インストール時に使用するレスポンスファイルを生成する
- Oracle Databaseをサイレント・インストールする

# Recipe. サイレント・インストール用のレスポンスファイルの生成
以下の3種類のファイルを作成します。
- Recipe
- Template
- Attribute

 ## レスポンスファイル配置用のディレクトリを作成
テンプレートから生成するレスポンスファイルの配置ディレクトリを作成し、オーナー/グループ権限を設定します。

```recipes/responsefile.rb
directory node['database']['response_file_dir'] do
  owner node['database']['owner']
  group node['database']['group']
  mode '0775'
end
```

## レスポンスファイルを生成
テンプレートからレスポンスファイルを生成し、オーナー/グループ権限を設定します。

```recipes/responsefile.rb
template node['database']['response_file_install'] do
  source 'install_oracledb.rsp.erb'
  owner node['database']['owner']
  group node['database']['group']
  mode '0644'
end
```

## レスポンスファイルのひな型
インストールに最低限必要な属性値をパラメータ化しています。
パラメータ化している主な項目は以下のものです。

|項目名|説明|
|-------|-----|
|ORACLE_HOSTNAME|ホスト名の指定|
|UNIX_GROUP_NAME|UNIXプラットフォーム上のグループ名の指定|
|INVENTORY_LOCATION|インベントリの場所の指定|
|SELECTED_LANGUAGES|選択された言語の指定|
|ORACLE_HOME|Oracleソフトウェアを格納するディレクトリを指定|
|ORACLE_BASE|Oracleディレクトリ構造（格納先）の最上位ディレクトリの場所の指定|
|oracle.install.db.InstallEdition|データベースのエディション|
|oracle.install.db.DBA_GROUP|DBAグループ名の指定<br>データベースの管理者グループ|
|oracle.install.db.OPER_GROUP|OPERグループ名の指定<br>制限されたデータベースの管理者グループ|
|oracle.install.db.BACKUPDBA_GROUP|BACKUPDBAグループ名の指定<br>データベースのバックアップとリカバリの管理グループ|
|oracle.install.db.DGDBA_GROUP|DBDBAグループ名の指定<br>Oracle Data Guard管理グループ|
|oracle.install.db.KMDBA_GROUP|KMDBAグループ名の指定<br>暗号化キー管理の管理グループ|

以下、Templateファイル

```tempalates/default/default.rb
ORACLE_HOSTNAME=<%= node['database']['host_name'] %>
UNIX_GROUP_NAME=<%= node['database']['group'] %>
INVENTORY_LOCATION=<%= node['database']['inventory_location'] %>
SELECTED_LANGUAGES=en
ORACLE_HOME=<%= node['database']['oracle_home'] %>
ORACLE_BASE=<%= node['database']['oracle_base'] %>
oracle.install.db.InstallEdition=EE
oracle.install.db.DBA_GROUP=<%= node['database']['dba_group'] %>
oracle.install.db.OPER_GROUP=<%= node['database']['oper_group'] %>
oracle.install.db.BACKUPDBA_GROUP=<%= node['database']['backupdba_group'] %>
oracle.install.db.DGDBA_GROUP=<%= node['database']['dgdba_group'] %>
oracle.install.db.KMDBA_GROUP=<%= node['database']['kmdba_group'] %>
```

## デフォルト値の設定
パラメータ化している属性値のデフォルト値を設定します。

以下の"ignoreSysPrereqs"オプションはコメントアウトし、使用しないようにしていますが、これはOracle Databaseインストール時の前提条件を無視する場合に使用します。
例えば、Swap領域が足らないような場合などにでも強制的にインストールする事が可能です。

```rb
default['database']['ignore_sysprereq'] = '-ignoreSysPrereqs'
```

```attributes/default.rb
default['database']['user'] = 'oracle'
default['database']['user_home'] = '/home/oracle'
default['database']['group'] = 'oinstall'
default['database']['owner'] = 'oracle'
default['database']['host_name'] = 'oel72db'
default['database']['inventory_location'] = '/u01/app/oraInventory'
default['database']['oracle_home'] = '/u01/app/oracle/product/12.1.0/dbhome_1'
default['database']['oracle_base'] = '/u01/app/oracle'
default['database']['dba_group'] = 'dba'
default['database']['oper_group'] = 'oper'
default['database']['backupdba_group'] = 'backupdba'
default['database']['dgdba_group'] = 'dgdba'
default['database']['kmdba_group'] = 'kmdba'
default['database']['runinstaller_path'] = '/vagrant_data/database_12102/runInstaller'
#default['database']['ignore_sysprereq'] = '-ignoreSysPrereqs'
default['database']['ignore_sysprereq'] = ''
default['database']['response_file_dir'] = '/home/oracle/responsefile'
default['database']['response_file_install'] = '/home/oracle/responsefile/install_oracledb.rsp'
default['database']['response_file_uninstall'] = '/home/oracle/responsefile/deinstall_oracledb.rsp'
```

# Oracle Databaseのサイレント・インストール
Oracle Universal Installerをサイレント・モードで起動し、作成しておいたレスポンスファイルを指定しています。

以下のようにUniversal Installerを起動する時に、**su -l -c**でコマンドを実行しています。
実は、Chefのexecuteリソースで**user**属性を使用して実行ユーザを切り替えても実行uidを変更しているのみで、環境変数などがchef実行ユーザ(**root**)のままとなっています。
そこで、suにログインオプションを付けてスクリプト実行を行うようにして対応しています。

```rb
command "su oracle -l -c .......
```

```recipes/install.rb
execute "install oracle database" do
  command "su oracle -l -c '#{node['database']['runinstaller_path']} #{node['database']['ignore_sysprereq']} -waitforcompletion -silent -responseFile #{node['database']['response_file_install']}'"
end
```

# Chefの実行イメージ
![chef-oracle-database-install.gif](https://bytebucket.org/shinyay/images-for-blog/raw/b363253d240506519d842e665c1f4bcce90b3b30/qiita/160630_chef-oracle-database-install/160630_chef-oracle-database-install.gif)

# まとめ
Oracle Databaseは導入した後に、Database Configuration Assistant (DBCA)をこの後実行してデータベースの作成を行っていきます。
この一連の作業の中で導入作業がChefを使って自動化できたのは作業効率があがると思います。

ところで、**su -l -c **でユーザを切り替えて実行をしていますが、それでも一部切り替わりきっていない点があるようでWARNINGが発生してしまいます。
解消方法は、引き続き探してみようと思います。

- [今回のレシピ：https://github.com/shinyay/chef-oracle-database/tree/publish_20160628](https://github.com/shinyay/chef-oracle-database/tree/publish_20160628 "chef-oracle-database
")
  - Oracle DatabaseをインストールするためのCookbookです。