でんかのブログ

テクニカル系ネタをメインに、つれづれなるままに書いていきます。

PuppetでOracleを自動インストール

Oracleのインストール、経験者ならわかると思いますが、ものすご~~~く面倒ですよね。(´・ω・`)

僕もはるか昔にSolarisOracleをインストールして以来、「Oracleインストールしてー(はぁと)」という言葉には身構えてしまいます。と、こ、ろ、が!今は昔と違うんですよ、奥さん!なんと!今ならPuppet使ってOracleが自動インストールできるんです!(゚∀゚)

え?どーせ自分でモジュール作ればってオチだろって?いえいえ違います!なんとORACLE ACEな方が作成されたPuppetモジュールを、今ならなんと、無料でご提供して貰えちゃうんですよー奥さん!今すぐお電話を!(ってドコにだ…)

…とまぁ、ヘタクソな通販番組ノリはここまでにしておいて(´・ω・`)、話の中身は本当です。“biemond/oradb”モジュールを使うと本当に本当に簡単ラクラクでOracleがインストールできちゃうんです。僕も最初は実は面倒なんぢゃね?って半信半疑だったのですが、使い方がわかれば本当に簡単。そんなワケで今回の記事は“biemond/oradb”モジュールでOracleインストールのお話です。(゚∀゚)

ちなみに“Puppetってナニ?(´・ω・`)”な方は「新人インフラ技術者のためのサーバー構築/運用自動化入門」最新記事一覧 - ITmedia Keywordsを先にご一読くださいませ。(゚∀゚)

“biemond/oradb”モジュールを使う準備

Puppet Labsが運営する“Puppet Forge”というモジュール共有サイトがあって、そこでは世界中のPuppetユーザが作成したPuppetのモジュールを公開しており、自由に入手できます。GitHubのPuppet専用版みたいなものですね。PuppetにはこのPuppet Forgeからモジュールを入手したり、キーワードで検索したりする機能があります。

Puppet Forgeへアクセスするには“puppet module”コマンドを使います。ここで“search”サブコマンドを使う事により、指定したキーワードにマッチするモジュールを表示できます。早速動かしてみましょう。ここではキーワードとして“oradb”を指定します。

# puppet module search oradb

Notice: Searching https://forgeapi.puppetlabs.com ...
NAME           DESCRIPTION                        AUTHOR        KEYWORDS
biemond-oradb  Oracle Database 11.2 / 12.1 li...  @biemond      fmw 11g 12c rcu

どうでしょう。このような結果になりましたか?もしここでキーワードに“oracle”とか指定するとすごい数のモジュールが出てきます。え?たくさん表示されたらどれ選べば良いかわからないですって?もっともです。そんな時はPuppet Forgeにアクセスして、画面上にある検索ボックスで検索しましょう。そうするとダウンロード数とスコアランキングが出てきます。ほとんどの場合はダウンロード数が多くてスコアが高いモノを選んで試してみるとよいでしょう。

今回は使うモジュールが“biemond/oradb”モジュールと決めています。これはBiemondさんが作られたoradbモジュールってコトなんですよね。まぁどうでもいいですか…。Biemondさんの経歴を見たらまさにOracleの神のような方で、さらに今はOracle社に居られるようですし、このモジュール使っておけば問題無いでしょう、たぶん。(´・ω・`)

では前置きが長くなりましたので、早速モジュールをダウンロードしちゃいましょう。“install”サブコマンドになります。

# puppet module install biemond-oradb

Notice: Preparing to install into /etc/puppet/modules ...
Notice: Downloading from https://forgeapi.puppetlabs.com ...
Notice: Installing -- do not interrupt ...
/etc/puppet/modules
mqw biemond-oradb (v1.0.33)
  tqq puppetlabs-concat (v2.0.0)
  mqq puppetlabs-stdlib (v4.6.0)

“biemond”と“oradb”の間はハイフンでもスラッシュでも、どちらでも大丈夫です。あとついでにモジュールを使う時にあると便利だと推奨されているモジュールも入れちゃいましょう。“fiddyspence-sysctl”モジュールと“erwbgy-limits”モジュールです。

# puppet module install fiddyspence-sysctl
Notice: Preparing to install into /etc/puppet/modules ...
Notice: Downloading from https://forgeapi.puppetlabs.com ...
Notice: Installing -- do not interrupt ...
/etc/puppet/modules
mqq fiddyspence-sysctl (v1.1.0)

# puppet module install erwbgy-limits
Notice: Preparing to install into /etc/puppet/modules ...
Notice: Downloading from https://forgeapi.puppetlabs.com ...
Notice: Installing -- do not interrupt ...
/etc/puppet/modules
mqq erwbgy-limits (v0.3.1)

まぁ名前のまんまの機能なモジュールですけど一応説明すると、fiddyspence-sysctl”モジュールはsysctl.confの編集機能で、“erwbgy-limits”モジュールがlimits.confの編集機能なモジュールです。

さて、残るは当たり前ですけどOracle本体をゲットしましょう。以下のURLからダウンロードできます。

Oracle Database Software Downloads | Oracle Technology Network | Oracle

必要なモノはdabtabaseとclientです。初期版はOTNに入っていればゲットできるのですが、パッチリリースはOracle Support必須で落とせないので、涙を呑んで11.2.0.1のx86_64をダウンロードしました。ただこの後ご紹介する11.2.0.1のマニフェストから、バージョンを指定する箇所やインストールファイル名の指定を変更するだけでそのまま使えるそうなので、どなたか11.2.0.4をお持ちの方、もし試されたら結果を教えてください…。m(_ _)m

ファイルのダウンロードが完了しましたら、/etc/puppet/modules/oradb/files に配置します。ファイル名はそのままで置いてくださいね。モジュールが気を利かせて1of2なファイルと2of2なファイルそれぞれダウンロードしてマージしてくれますので(最初わからなくてハマりました(´・ω・`))。以上で準備は完了です!(゚∀゚)

マニフェストの準備

ここからは一度だけでもOracleを手作業でインストールした経験があるのが望ましいです。内容がOracleのインストール手順を知っているのが前提になるってのもありますが、一度手作業で経験しておけば、いかにこのモジュールが偉大かわかりますしね。( ̄ー ̄)ニヤリ

でも一応「そんな面倒なコトやってられっかー!(#゚ロ゚#)」という気が短いOracle未経験な方向けに、簡単にOracleインストールの流れを説明しますね。流れはざっと以下のようなカンジです。

  1. oinstall、dba、operグループの作成とoracleユーザの作成

  2. kernelパラメータの設定とlimitsの設定

  3. 必須パッケージのインストール

  4. Oracle Universal Installerで本体のインストール

  5. 必要に応じてパッチの適用

  6. Net8の設定とリスナーの設定

  7. データベースインスタンスの作成

  8. インスタンスの起動設定

  9. tnsnames.oraの設定

かな~り端折って書いてもざっとこれだけの手順があります。そして3以降は大体ハマりどころがあるというオマケ付きです。はい、考えるのもイヤになりましたね。僕もイヤです。(;´∀`)ハァ…

そんなイヤな作業はPuppetさんにやって貰っちゃいましょう!Puppetさん、ステキ!(゚∀゚

事前準備(1~3)

先ほどの流れで1~3が事前準備フェーズです。ここのマニフェストをサクっと作っちゃいましょう。最初に注意点がひとつあります。後半の手順でNet8の設定がありますが、ここは自分自身のホスト名が名前解決できないとエラーになっちゃいます。なので忘れないようにマニフェストに書いておきましょう。こんなカンジです。

host {'cent65': ip => $::ipaddress, }

ウチの試験環境のホスト名は“cent65”なんでこの記述ですが、、皆さんは皆さんのホスト名を書いてくださいね、当たり前ですが。あとIPアドレスはfacter変数から取得するので、複数NIC搭載の環境でない限りはこのままで大丈夫ですが、複数NIC搭載されてるマシンの方は直接IPアドレス書いちゃうほうが良いかもです。あ、あとDNSなどで名前解決できる環境だったり、hostsの設定は確実にされている環境な方は別にこの行はいらないですので、念のため。(´・ω・`)

さて本題です。最初にグループ作っちゃいましょう。

$all_groups = ['oinstall','dba' ,'oper']
group { $all_groups :
    ensure      => present,
}

Puppetではリソース定義の際に配列を渡すと複数の定義をまとめて書けるんです。この記述、便利なんで覚えておきましょう。(゚∀゚)

さて、お次はoracleユーザですね。(`・ω・´)

user { 'oracle' :
  ensure      => present,
  uid         => 500,
  gid         => 'oinstall',
  groups      => ['oinstall','dba','oper'],
  shell       => '/bin/bash',
  password    => 'xxxxxxxxxx', # openssl passwd -1で生成した値を記入
  home        => "/home/oracle",
  comment     => "This user oracle was created by Puppet",
  require     => Group[$all_groups],
  managehome  => true,
}

簡単ですね!余談ですが、ここのrequire文は無くても問題無く動くんです。って言うとPuppet知ってる方は「実行順が不定なんだからダメじゃん」って言うかもですね。そうです、Puppetでは設定変えない限りはマニフェストの実行順はPuppetのみぞ知るなのです。なのでgroupリソースの次にuserリソース書いたからと言って、userリソースが実行されるときにグループが作成済とは限らない、つまりエラーになっちゃうんですよね。なのでrequireが入ってるワケです。「あれ?さっきいらないって言ったじゃん?」って思った人スルドイ!実はPuppetさん、このようなリソースの依存関係を暗黙で解決しちゃうんです。この機能、原文で“Implicit Dependencies(暗黙の依存)”となってるので、まさにそのまんまですね(笑)。でも書いたほうがわかりやすいのも事実なので、そういう機能もあるんだーくらいに思っておいて頂ければ。って、これじゃ何が言いたかったかわからないですね…ついでなんでPuppetの機能を紹介したまでです、はい。(´・ω・`)

気を取り直して、kernelパラメータとlimitsの設定しちゃいましょう。先ほどダウンロードしたモジュールで簡単にできちゃいます!(゚∀゚)

最初にkernelパラメータ(`・ω・´)

sysctl { 'kernel.msgmnb':                 ensure => 'present', permanent => 'yes', value => '65536',}
sysctl { 'kernel.msgmax':                 ensure => 'present', permanent => 'yes', value => '65536',}
sysctl { 'kernel.shmmax':                 ensure => 'present', permanent => 'yes', value => '2588483584',}
sysctl { 'kernel.shmall':                 ensure => 'present', permanent => 'yes', value => '2097152',}
sysctl { 'fs.file-max':                   ensure => 'present', permanent => 'yes', value => '6815744',}
sysctl { 'net.ipv4.tcp_keepalive_time':   ensure => 'present', permanent => 'yes', value => '1800',}
sysctl { 'net.ipv4.tcp_keepalive_intvl':  ensure => 'present', permanent => 'yes', value => '30',}
sysctl { 'net.ipv4.tcp_keepalive_probes': ensure => 'present', permanent => 'yes', value => '5',}
sysctl { 'net.ipv4.tcp_fin_timeout':      ensure => 'present', permanent => 'yes', value => '30',}
sysctl { 'kernel.shmmni':                 ensure => 'present', permanent => 'yes', value => '4096', }
sysctl { 'fs.aio-max-nr':                 ensure => 'present', permanent => 'yes', value => '1048576',}
sysctl { 'kernel.sem':                    ensure => 'present', permanent => 'yes', value => '250 32000 100 128',}
sysctl { 'net.ipv4.ip_local_port_range':  ensure => 'present', permanent => 'yes', value => '9000 65500',}
sysctl { 'net.core.rmem_default':         ensure => 'present', permanent => 'yes', value => '262144',}
sysctl { 'net.core.rmem_max':             ensure => 'present', permanent => 'yes', value => '4194304', }
sysctl { 'net.core.wmem_default':         ensure => 'present', permanent => 'yes', value => '262144',}
sysctl { 'net.core.wmem_max':             ensure => 'present', permanent => 'yes', value => '1048576',}

次にlimits.conf!(`・ω・´)

class { 'limits':
  config => {
             '*'       => { 'nofile'  => { soft => '2048'   , hard => '8192',   },},
             'oracle'  => { 'nofile'  => { soft => '65536'  , hard => '65536',  },
                             'nproc'  => { soft => '2048'   , hard => '16384',  },
                             'stack'  => { soft => '10240'  ,},},
             },
  use_hiera => false,
}

ちなみにこの設定値はサンプルの値そのまま引っ張ってるんで、実際に使う時はマニュアル見て設定してくださいね。(´・ω・`)

事前準備フェーズ最後の作業は依存パッケージのインストールです。これも配列使って簡潔に表現しちゃいましょう。(`・ω・´)

$install = [ 'binutils.x86_64', 'compat-libstdc++-33.x86_64', 'glibc.x86_64','ksh.x86_64','libaio.x86_64',
             'libgcc.x86_64', 'libstdc++.x86_64', 'make.x86_64','compat-libcap1.x86_64', 'gcc.x86_64',
             'gcc-c++.x86_64','glibc-devel.x86_64','libaio-devel.x86_64','libstdc++-devel.x86_64',
             'sysstat.x86_64','unixODBC-devel','glibc.i686','libXext.x86_64','libXtst.x86_64']
package { $install:
  ensure  => present,
}

これで事前準備フェーズのマニフェストは完成です!(゚∀゚)

Oracleインストール

それではメインディッシュ、Oracle本体のインストールです!(`・ω・´)

マニフェストとしては以下の内容です。

$puppetDownloadMntPoint = "puppet:///modules/oradb/"
oradb::installdb{ '112010_Linux-x86-64':
  version       => '11.2.0.1',
  file          => 'linux.x64_11gR2_database',
  databaseType  => 'SE',
  oracleBase    => '/oracle',
  oracleHome    => '/oracle/product/11.2/db',
  user          => 'oracle',
  group         => 'dba',
  group_install => 'oinstall',
  group_oper    => 'oper',
  downloadDir   => '/install',
  zipExtract    => true,
  puppetDownloadMntPoint => $puppetDownloadMntPoint,
  require       => Package[$install],
}

ここで設定すべき属性値は以下の通りです。

  • version

    バージョン番号を記述します。モジュールはこのバージョンを参照して動作を変えているようなので、適切な値を記述してください。

  • databaseType

    データベースのエディションです。EEもしくはSEを設定します。

  • file

    インストールイメージのファイル名を記述します。注意点としてはダウンロードしたファイルのファイル名は“linux.x64_11gR2_database_1of2.zip”と“~2of2.zip”となっていますが、“1of2.zip”な部分を省いたファイル名を記述します。つまり記述すべきファイル名は“linux.x64_11gR2_database_1of2.zip”と“~_2of2.zip”なら“linux.x64_11gR2_database”となるワケです。「2つあるのに、それでいいん?(´・ω・`)」と思われたかも知れませんが、いいんです。モジュールの中で気を利かせて(?)補完して処理してるので。(゚∀゚)

  • oracleBase、oracleHome

    通常のOracleインストールのORACLE_BASE、ORACLE_HOMEと同様の意味です。え?ちゃんと説明しろって?インストールマニュアルに詳しく書いてありますよん。(゚∀゚)ウケケ

  • user、group、group_install、group_oper

    これも通常のOracleインストールと同じなワケですが、最初に実施したユーザ作成とグループ作成で個性(?)を出してない限りは、基本この例のままで大丈夫です。

  • downloadDir

    インストールイメージをダウンロードして展開する場所です。2GB以上あるので、それなりに容量確保できるディレクトリを指定しましょう。

  • zipExtract

    インストールイメージを展開済みの場合はfalseにすればunzipしないようになりますが、まぁ通常はダウンロードしたままにしておいた方が管理も入れ替えもラクだと思います。(´・ω・`)

  • puppetDownloadMntPoint

    インストールイメージの取得先です。モジュールではインストールイメージの取得に、Puppetのfileリソースのsource属性でPuppet URLを使ってダウンロードしています。そのためインストールイメージを配置した場所をPuppet URL形式で記述しておきます。前に説明した通り、/etc/puppet/modules/oradb/filesにファイルを配置したのでしたら、この例にあるように“puppet:///modules/oradb/”になります。意味がわからないですって?そんなあなた!まずはPuppetを学ぶ — 序文 — Documentation — Puppet Labsを読みましょう!今なら日本語訳もあります!!(゚∀゚)

Net8、リスナーの設定

次はNet8とリスナーの設定です!(`・ω・´)

マニフェストとしては以下の内容です。

oradb::net{ 'config net8':
  oracleHome   => '/oracle/product/11.2/db',
  version      => '11.2',
  user         => 'oracle',
  group        => 'dba',
  downloadDir  => '/install',
  dbPort       => '1521',
  require      => Oradb::Installdb['112010_Linux-x86-64'],
}

db_listener{ 'startlistener':
  ensure          => 'running',
  oracle_base_dir => '/oracle',
  oracle_home_dir => '/oracle/product/11.2/db',
  os_user         => 'oracle',
  listener_name   => 'listener',
  require         => Oradb::Net['config net8'],
}

oradb::listener{'start listener':
  action       => 'start',  # running|start|abort|stop
  oracleBase   => '/oracle',
  oracleHome   => '/oracle/product/11.2/db',
  user         => 'oracle',
  group        => 'dba',
  listenername => 'listener',
  require      => Db_listener['startlistener'],
}

基本、この例のまま記述で問題ないかと思います。あ、もちろんディレクトリや名称など変更されたのなら、ちゃんと空気を読んで変更してくださいね。(´・ω・`)

データベースインスタンスの作成

残る大物、データベースインスタンスの作成です!(`・ω・´)

マニフェストとしては以下の内容です。

oradb::database{ 'testDb_Create':
  oracleBase              => '/oracle',
  oracleHome              => '/oracle/product/11.2/db',
  version                 => '11.2',
  user                    => 'oracle',
  group                   => 'dba',
  downloadDir             => '/install',
  action                  => 'create',
  dbName                  => 'db01',
  dbDomain                => 'denka.orz.hm',
  dbPort                  => '1521',
  sysPassword             => 'Welcome01',
  systemPassword          => 'Welcome01',
  dataFileDestination     => "/oracle/oradata",
  recoveryAreaDestination => "/oracle/flash_recovery_area",
  characterSet            => "AL32UTF8",
  nationalCharacterSet    => "UTF8",
  initParams              => {'open_cursors'        => '1000',
                              'processes'           => '600',
                              'job_queue_processes' => '4' },
  sampleSchema            => 'TRUE',
  memoryPercentage        => "40",
  memoryTotal             => "800",
  databaseType            => "MULTIPURPOSE",
  emConfiguration         => "NONE",
  require                 => Oradb::Listener['start listener'],
}

ここで設定すべき属性値は………と思ったのですが、Oracleはあまり詳しくない僕が書くよりもインストールマニュアルというものがありますので、そちらを参照してくださいませ。とりあえずインストールマニュアルに出てくる名称と属性名が同じモノは同じモノと考えて大丈夫です。(^-^;

一応この例で変更したところは、DB名を“db01”、DBドメインを“denka.orz.hm”としました。あとは面倒なんでサンプルのままにしてます…。(´・ω・`)

あ、それと依存関係としてリスナーの起動が終わった後になるように設定するのを忘れないでくださいね!

インスタンスの起動設定

最後の仕上げです!作成したデータベースインスタンスを起動しましょう!(`・ω・´)

マニフェストとしては以下の内容です。

oradb::dbactions{ 'start testDb':
  oracleHome              => '/oracle/product/11.2/db',
  user                    => 'oracle',
  group                   => 'dba',
  action                  => 'start',
  dbName                  => 'db01',
  require                 => Oradb::Database['testDb_Create'],
}

oradb::autostartdatabase{ 'autostart oracle':
  oracleHome              => '/oracle/product/11.2/db',
  user                    => 'oracle',
  dbName                  => 'db01',
  require                 => Oradb::Dbactions['start testDb'],
}

まぁ今回も特筆すべきコトは無いのですが。(´・ω・`)

とりあえず先ほど作成したDB名を入れるコトと依存関係に注意してください。一応Oracle知らない人向けに書くと、oradb::dbactionsでデータベースインスタンスを起動しています。「じゃあoradb::autostartdatabaseはナニ?」となると思いますが、こちらはデータベースが起動した時にインスタンス自動起動するための設定です。デフォルトでは自動起動しないのでこの設定が必要になるのです。(´・ω・`)

tnsnames.oraの設定

これでフィニッシュです!tnsnames.oraを設定しましょう!(`・ω・´)

え?「tnsnames.oraってナニ?」ですって?マニュアル読んでくださいませ。簡単に且つ乱暴な例えを言うとOracle専用のhostsファイルみたいなもんです。(´・ω・`)

マニフェストとしては以下の内容です。

oradb::tnsnames{'db01':
  oracleHome         => '/oracle/product/11.2/db',
  user               => 'oracle',
  group              => 'dba',
  server             => { myserver => { host => cent65, port => '1521', protocol => 'TCP' }},
  connectServiceName => 'db01.denka.orz.hm',
  connectServer      => 'DEDICATED',
  require            => Oradb::Dbactions['start testDb'],
}

ここで設定すべき属性値は以下の通りです。

  • connectServiceName

    ネットサービス名を設定します。ネットサービス名はデフォルトで“DB名.DBドメイン名”です。変更するには以下のようにします。

      ALTER SYSTEM SET SERVICE_NAMES = service_name;
      ALTER SYSTEM SET SERVICE_NAMES = ( service_name1, ... , service_name2 );
    

    あとは例のままで良いかと思います。その他の詳細はマニュアルへ(そればっか)。(´・ω・`)

サンプルスキーマの作成

ここまででOracleインストールのマニフェストは完成ですが、これだけだと器は作ったけど中身が無い状態で、何も面白くありません。昔のバージョンだと“scott/tiger”というサンプルスキーマがデフォルトで入っていたのですが今は入りません。でも伝統的なサンプルなので作成用のSQLは入っています。この後の動作確認でも必要ですし、せっかくなのでPuppetさんにインストールして貰いましょう!(゚∀゚)

マニフェストは以下のようになります。

exec {'install sample':
  command => '/oracle/product/11.2/db/bin/sqlplus sys/oracle as sysdba @/oracle/product/11.2/db/rdbms/admin/utlsampl.sql',
  environment => ['ORACLE_SID=db01','ORACLE_HOME=/oracle/product/11.2/db'],
  user    => 'oracle',
  require           => Oradb::Tnsnames['db01'],
}

特筆すべき点としては、execリソースを使う際にoracleユーザでなければならないコトと、環境変数としてORACLE_SIDとORACLE_HOMEが必須であることです。具体的には属性値environmentとuserになります。あとは全ての作業が終わった後にこの作業を実施するよう、依存関係は入れておきましょう。

マニフェスト作成作業は以上になります。

長くなりましたし、一旦ここで切ります。次回はこのマニフェストを実際に動作させてインストールを実行し、sqlplusでSQLを発行します!(`・ω・´)

Oracle Clientのインストールも紹介しますのでお楽しみに!(゚∀゚)

以下、コピペ用マニフェストまとめ。(´・ω・`)

$all_groups = ['oinstall','dba' ,'oper']
 group { $all_groups :
  ensure      => present,
}

host {'cent65': ip => $::ipaddress, }

user { 'oracle' :
  ensure      => present,
  uid         => 500,
  gid         => 'oinstall',
  groups      => ['oinstall','dba','oper'],
  shell       => '/bin/bash',
  password    => 'xxxxxxxx',
  home        => "/home/oracle",
  comment     => "This user oracle was created by Puppet",
  require     => Group[$all_groups],
  managehome  => true,
}

sysctl { 'kernel.msgmnb':                 ensure => 'present', permanent => 'yes', value => '65536',}
sysctl { 'kernel.msgmax':                 ensure => 'present', permanent => 'yes', value => '65536',}
sysctl { 'kernel.shmmax':                 ensure => 'present', permanent => 'yes', value => '2588483584',}
sysctl { 'kernel.shmall':                 ensure => 'present', permanent => 'yes', value => '2097152',}
sysctl { 'fs.file-max':                   ensure => 'present', permanent => 'yes', value => '6815744',}
sysctl { 'net.ipv4.tcp_keepalive_time':   ensure => 'present', permanent => 'yes', value => '1800',}
sysctl { 'net.ipv4.tcp_keepalive_intvl':  ensure => 'present', permanent => 'yes', value => '30',}
sysctl { 'net.ipv4.tcp_keepalive_probes': ensure => 'present', permanent => 'yes', value => '5',}
sysctl { 'net.ipv4.tcp_fin_timeout':      ensure => 'present', permanent => 'yes', value => '30',}
sysctl { 'kernel.shmmni':                 ensure => 'present', permanent => 'yes', value => '4096', }
sysctl { 'fs.aio-max-nr':                 ensure => 'present', permanent => 'yes', value => '1048576',}
sysctl { 'kernel.sem':                    ensure => 'present', permanent => 'yes', value => '250 32000 100 128',}
sysctl { 'net.ipv4.ip_local_port_range':  ensure => 'present', permanent => 'yes', value => '9000 65500',}
sysctl { 'net.core.rmem_default':         ensure => 'present', permanent => 'yes', value => '262144',}
sysctl { 'net.core.rmem_max':             ensure => 'present', permanent => 'yes', value => '4194304', }
sysctl { 'net.core.wmem_default':         ensure => 'present', permanent => 'yes', value => '262144',}
sysctl { 'net.core.wmem_max':             ensure => 'present', permanent => 'yes', value => '1048576',}

class { 'limits':
  config => {
             '*'       => { 'nofile'  => { soft => '2048'   , hard => '8192',   },},
             'oracle'  => { 'nofile'  => { soft => '65536'  , hard => '65536',  },
                             'nproc'  => { soft => '2048'   , hard => '16384',  },
                             'stack'  => { soft => '10240'  ,},},
             },
  use_hiera => false,
}

$install = [ 'binutils.x86_64', 'compat-libstdc++-33.x86_64', 'glibc.x86_64','ksh.x86_64','libaio.x86_64',
             'libgcc.x86_64', 'libstdc++.x86_64', 'make.x86_64','compat-libcap1.x86_64', 'gcc.x86_64',
             'gcc-c++.x86_64','glibc-devel.x86_64','libaio-devel.x86_64','libstdc++-devel.x86_64',
             'sysstat.x86_64','unixODBC-devel','glibc.i686','libXext.x86_64','libXtst.x86_64']
package { $install:
  ensure  => present,
}

$puppetDownloadMntPoint = "puppet:///modules/oradb/"
oradb::installdb{ '112010_Linux-x86-64':
  version       => '11.2.0.1',
  file          => 'linux.x64_11gR2_database',
  databaseType  => 'SE',
  oracleBase    => '/oracle',
  oracleHome    => '/oracle/product/11.2/db',
  user          => 'oracle',
  group         => 'dba',
  group_install => 'oinstall',
  group_oper    => 'oper',
  downloadDir   => '/install',
  zipExtract    => true,
  puppetDownloadMntPoint => $puppetDownloadMntPoint,
  require       => Package[$install],
}

oradb::net{ 'config net8':
  oracleHome   => '/oracle/product/11.2/db',
  version      => '11.2',
  user         => 'oracle',
  group        => 'dba',
  downloadDir  => '/install',
  dbPort       => '1521', #optional
  require      => Oradb::Installdb['112010_Linux-x86-64'],
}

db_listener{ 'startlistener':
  ensure          => 'running',  # running|start|abort|stop
  oracle_base_dir => '/oracle',
  oracle_home_dir => '/oracle/product/11.2/db',
  os_user         => 'oracle',
  listener_name   => 'listener', # which is the default and optional
  require         => Oradb::Net['config net8'],
}

oradb::listener{'start listener':
  action       => 'start',  # running|start|abort|stop
  oracleBase   => '/oracle',
  oracleHome   => '/oracle/product/11.2/db',
  user         => 'oracle',
  group        => 'dba',
  listenername => 'listener', # which is the default and optional
  require      => Db_listener['startlistener'],
}

oradb::database{ 'testDb_Create':
  oracleBase              => '/oracle',
  oracleHome              => '/oracle/product/11.2/db',
  version                 => '11.2',
  user                    => 'oracle',
  group                   => 'dba',
  downloadDir             => '/install',
  action                  => 'create',
  dbName                  => 'db01',
  dbDomain                => 'denka.orz.hm',
  dbPort                  => '1521',
  sysPassword             => 'Welcome01',
  systemPassword          => 'Welcome01',
  dataFileDestination     => "/oracle/oradata",
  recoveryAreaDestination => "/oracle/flash_recovery_area",
  characterSet            => "AL32UTF8",
  nationalCharacterSet    => "UTF8",
  initParams              => {'open_cursors'        => '1000',
                              'processes'           => '600',
                              'job_queue_processes' => '4' },
  sampleSchema            => 'TRUE',
  memoryPercentage        => "40",
  memoryTotal             => "800",
  databaseType            => "MULTIPURPOSE",
  emConfiguration         => "NONE",
  require                 => Oradb::Listener['start listener'],
}

oradb::dbactions{ 'start testDb':
  oracleHome              => '/oracle/product/11.2/db',
  user                    => 'oracle',
  group                   => 'dba',
  action                  => 'start',
  dbName                  => 'db01',
  require                 => Oradb::Database['testDb_Create'],
}

oradb::autostartdatabase{ 'autostart oracle':
  oracleHome              => '/oracle/product/11.2/db',
  user                    => 'oracle',
  dbName                  => 'db01',
  require                 => Oradb::Dbactions['start testDb'],
}

oradb::tnsnames{'db01':
  oracleHome         => '/oracle/product/11.2/db',
  user               => 'oracle',
  group              => 'dba',
  server             => { myserver => { host => cent65, port => '1521', protocol => 'TCP' }},
  connectServiceName => 'db01.denka.orz.hm',
  connectServer      => 'DEDICATED',
  require            => Oradb::Dbactions['start testDb'],
}

exec {'install sample':
  command => '/oracle/product/11.2/db/bin/sqlplus sys/oracle as sysdba @/oracle/product/11.2/db/rdbms/admin/utlsampl.sql',
  environment => ['ORACLE_SID=db01','ORACLE_HOME=/oracle/product/11.2/db'],
  user    => 'oracle',
  require           => Oradb::Tnsnames['db01'],
}