Chefを使ってOracle Databaseをインストール&データベース作成をサイレント・モードで実施してみた


# 概要
Chefを利用してのOracle Data baseのサイレント・インストールを実施してみました。

-[Chefを使ってOracle Databaseをサイレント・インストールしてみた](http://qiita.com/shinyay/items/77209348f68cf145063e)

上記の投稿での記載しましたが、Oracle Databaseは導入した後にDatabase Configuration Assistant (DBCA)で構成を行う事でデータベースを利用する事が可能となります。

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

## DBCAを使用したデータベースの作成

DBCAは対話型 (GUIによるウィザード形式)か、非対話型 (スクリプトによるバッチ形式)での実行が可能です。

対話型でのDBCAによる作業手順は、マニュアルの次の箇所にまとめられています。

- [DBCAを使用したデータベースの作成および管理](https://docs.oracle.com/cd/E49329_01/server.121/b71307/install.htm#BABEIAID)

一方で、非対話型 (サイレントモード) でのDBCAの使用方法は、次の場所に記載があります。

- [非対話型(サイレント)DBCAを使用したデータベースの作成](https://docs.oracle.com/cd/E49329_01/server.121/b71301/create.htm#CIABGCIH)

サイレント・モードでは、DBCAコマンドのパラメータとして、各種属性値を渡すか、レスポンスファイルとして事前に作成し、そのファイルをパラメータとして渡すかの実施方法があります。
実施は次のコマンドで実施します。

```shell-session
$ORACLE_HOME/bin/dbca -silent -responseFile /PATH/TO/DBCA-RESONSE-FILE.rsp 
```

## 今回作成するRecipe
- DBCAで使用するレスポンスファイルを生成する
- DBCAをサイレント・モードで実行し、データベースを作成する

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

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

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

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

|項目名|説明|
|-------|-----|
|OPERATION_TYPE|動作タイプ<br>以下の分類参照|

---
- OPERATION_TYPE

|コマンド|説明|
|-------|-----|
|createDatabase|データベースを作成|
|createTemplateFromDB|既存のデータベースからデータベース・テンプレートを作成|
|createCloneTemplate|既存のデータベースからクローン(シード)データベース・テンプレートを作成|
|deleteDatabase|データベースを削除|
|configureDatabase|データベースを構成|
|createPluggableDatabase|CDBにPDBを作成|
|unplugDatabase|CDBからPDBを切断|
|deletePluggableDatabase|PDBを削除|
|configurePluggableDatabase|PDBを構成|

---
|項目名|説明|
|-------|-----|
|GDBNAME|グローバル・データベース名<br>database_name.domain_name形式|
|SID|データベース・システム識別子|
|CREATEASCONTAINERDATABASE|CDBの作成フラグ<br>デフォルト：false (非CDB)|
|NUMBEROFPDBS|作成するPDBの数<br>デフォルト：0|
|PDBNAME|各PDBの名前<br>NUMBEROFPDBSが1より大きい場合はそれぞれの名前に番号が付与|
|PDBADMINPASSWORD|PDBのローカル管理者のパスワード|
|TEMPLATENAME|デフォルトの場所の既存のテンプレートの名前|
|SYSPASSWORD|新しいデータベースのSYSユーザー・パスワード|
|SYSTEMPASSWORD|新しいデータベースのSYSTEMユーザー・パスワード|
|CHARACTERSET|データベースのキャラクタ・セット|
|NATIONALCHARACTERSET|データベースの各国語キャラクタ・セット|

- [(参考)サイレント・モード時のDatabase Configuration Assistantコマンド・リファレンス](https://docs.oracle.com/cd/E49329_01/server.121/b71301/create.htm#BABCCFJE)

以下、Templateファイルより抜粋

```tempalates/default/default.rb
OPERATION_TYPE = "<%= node['database']['operation_type'] %>"
GDBNAME = "<%= node['database']['gdbname'] %>"
SID = "<%= node['database']['sid'] %>"
CREATEASCONTAINERDATABASE = <%= node['database']['create_as_container_database'] %>
NUMBEROFPDBS = <%= node['database']['number_of_pdbs'] %>
PDBNAME = <%= node['database']['pdbname'] %>
PDBADMINPASSWORD = "<%= node['database']['pdb_admin_password'] %>"
TEMPLATENAME = "<%= node['database']['template_name'] %>"
SYSPASSWORD = "<%= node['database']['sys_password'] %>"
SYSTEMPASSWORD = "<%= node['database']['system_password'] %>"
CHARACTERSET = "<%= node['database']['characterset'] %>"
NATIONALCHARACTERSET = "<%= node['database']['national_characterset'] %>"
```

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

今回はパスワードは平文でハードコードしていますが、実際はData Bagを使用して暗号化するとよいです。

```attributes/default.rb
default['database']['operation_type'] = 'createDatabase'
default['database']['gdbname'] = 'orcl'
default['database']['sid'] = 'orcl'
default['database']['create_as_container_database'] = 'true'
default['database']['number_of_pdbs'] = '2'
default['database']['pdbname'] = 'pdb'
default['database']['pdb_admin_password'] = <平文パスワードのハードコード>
default['database']['template_name'] = 'General_Purpose.dbc'
default['database']['sys_password'] = <平文パスワードのハードコード>
default['database']['system_password'] = <平文パスワードのハードコード>
default['database']['characterset'] = 'AL32UTF8'
default['database']['national_characterset'] = 'AL16UTF16'
```

# DBCAサイレント・モードによるデータベースの生成
executeリソースによりdbcaコマンドを**インストール・ユーザ**(この例ではoracle)で実行します。

```recipes/dbca.rb
execute "dbca oracle database" do
  user node['database']['user']
  group node['database']['group']
  command "#{node['database']['oracle_home']}/bin/dbca -silent -responseFile #{node['database']['response_file_dbca']}"
  not_if { Dir.exist?("#{node['database']['oracle_base']}/oradata") }
end
```

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

# まとめ
Chefを利用してOracle Databaseの基本的な構成を用意する事が自動で行えるようになりました。
このようなChefによる基本構成のCookbookがあれば、これをベースとした様々な構成を組む事も容易にできるようになります。

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