仮想リソースとは?
仮想リソースは通常のリソースとは異なり、
仮想リソースの宣言は通常のリソースの宣言とほぼ同じですが、
@user { luke: ensure => present }
この仮想リソースをシステムに適用するためには、
realize(User['luke'])
これでシステム上にlukeというユーザが作成されます。
他にも実体化の方法はありますが、
仮想リソースの利用シナリオ
仮想リソースの利用シーンとして、
- ウェブサービスのためのサーバを構築する。
- このウェブサービスでは、
前段にリバースプロキシを置いてブラウザからのリクエストを受ける。 - リバースプロキシは背後のウェブアプリケーションサーバにリクエストを中継する。
- スモールスタートでコストを抑えつつ、
冗長性も確保するために、 マシンは2台用意し、 それぞれにリバースプロキシとウェブアプリケーションサーバを同居させる。 - リバースプロキシ、
ウェブアプリケーションのどちらでも負荷に応じて個別に台数を増やせるような柔軟性を確保する。 - リバースプロキシで利用するPerlbalと、
ウェブアプリケーションで利用するBackgrounDrbのプロセスは、 daemontoolsで管理する。
このようなシナリオを想定した上で、
リバースプロキシとウェブアプリケーションサーバが同居しない場合には、
class proxy {
package {
'daemontools':
ensure => present;
'perl-Perlbal':
ensure => present;
}
}
class www {
package {
'daemontools':
ensure => present;
'rubygem-rails':
ensure => present;
}
}
node proxy {
include proxy
}
node www {
include www
}
リバースプロキシとウェブアプリケーションサーバを同居させようとした場合、
class proxy {
package {
'daemontools':
ensure => present;
'perl-Perlbal':
ensure => present;
}
}
class www {
package {
'daemontools':
ensure => present;
'rubygem-rails':
ensure => present;
}
}
node proxy_and_www {
include proxy
include www
}
これをシステムに適用しようとすると、
err: Could not retrieve configuration: Duplicate definition: Package[daemontools] is already defined in file manifests/site.pp at line 11; cannot redefine at manifests/site.pp:2
では、
class proxy {
package {
'daemontools':
ensure => present;
'perl-Perlbal':
ensure => present;
}
}
class www {
package { 'rubygem-rails': ensure => present; }
}
node proxy_and_www {
include proxy
include www
}
このマニフェスト自体は問題ありませんが、
node www {
include www
}
wwwクラスにはdaemontoolsパッケージリソースの宣言がないため、
これを解決するために、
@package { 'daemontools': ensure => present }
class proxy {
realize(Package['daemontools'])
package { 'perl-Perlbal': ensure => present; }
}
class www {
realize(Package['daemontools'])
package { 'rubygem-rails': ensure => present; }
}
node proxy_and_www {
include proxy
include www
}
node proxy {
inclue proxy
}
node www {
include www
}
こうすることで、
このように仮想リソースを利用することで、
仮想リソースの実体化
relize関数での実体化
最初の方でも述べましたが、
realize User[luke]
複数の仮想リソースを実体化する場合には、
realize(User[johnny], User[billy])
コレクションでの実体化
もうひとつの方法は、Type<| condition |>
といった形で記述します。
たとえば、
User <| title == luke |>
条件には == 以外にも、
Grpup <| title != sysadmin |>
File <| owner == root and mode == 400 |>
User <| title == luke or (group == dba or group == sysadmin) |>
コレクションを利用すると、
仮想リソースの解説は以上です。次回はFacterの拡張方法について解説予定です。