Puppetのマニフェストを全部Chefのレシピに書きなおしてみました。
ので、その違いとか。
パッケージのインストール
例:httpdのインストール
Puppet
package { 'httpd': name => 'httpd', ensure => latest, require => File['/etc/yum.repos.d/CentOS-Base.repo'], }
Chef
package 'httpd' do action :install end
パッケージのアンインストール
例:sendmailのアンインストール
Puppet
package { 'sendmail': ensure => purged, }
Chef
package 'sendmail' do action :remove end
デーモンの起動と自動起動設定
例:httpdの起動と自動起動設定
Puppet
service {'httpd': name => 'httpd', enable => 'true', ensure => running, require => Package['httpd'], }
Chef
service 'httpd' do action [:enable, :start] end
ファイルのownerやパーミッションの変更
例:/tmp/test.txtのownerやパーミッションの変更
Puppet
file { '/tmp/test': owner => 'root', group => 'root', mode => 644, }
Chef
file '/tmp/test.txt' do owner 'root' group 'root' mode '0644' end
ディレクトリの作成
例:/tmp/testdirを作成
既にディレクトリが存在したら上書きしない。パーミッションなど。
Puppet
file { '/tmp/testdir': ensure => directory, owner => 'root', group => 'root', mode => 775, recurse => 'true', replace => 'false', }
Chef
directory '/tmp/testdir' do owner 'root' group 'root' recursive true mode 0775 action :create not_if { File.exists? '/tmp/testdir' } end
グループの作成
例:testgroupを作成
Puppet
group { 'testgroup': gid => 500; }
Chef
group 'testgroup' do gid 500 action :create end
ユーザの作成
例:testuser作成
Puppet
user { 'testuser': gid => 500, home => '/home/testuser', managehome => true, shell => '/bin/bash', }
Chef
user 'testuser' do home '/home/testuser' shell '/bin/bash' uid 10000 gid 'testgroup' supports :manage_home => true action :create end
テンプレートファイルを使ったファイルの配置
例:/etc/aliasesを配置
Puppet
file { '/etc/aliases': content => template('/etc/puppet/manifests/templates/etc/aliases'), owner => 'root', group => 'root', mode => 644, }
Chef
template '/etc/aliases' do source 'etc/aliases.erb' group 'root' owner 'root' mode '0644' notifies :run, 'execute[newaliases]' end
execを使ったシステムコマンドの実行
例:/etc/aliasesが更新されたらnewaliasesコマンドを実行
Puppet
exec { 'newaliases': path => ['/usr/bin'], command => 'newaliases', require => File['/etc/aliases'], subscribe => File['/etc/aliases'], refreshonly => true, }
Chef
execute 'newaliases' do command '/usr/bin/newaliases' action :nothing end
テンプレートに変数を埋め込む構文
例:/etc/resolv.confのテンプレートにドメインとNSのIPを埋め込む
Puppet
ドメインはfacter変数を埋め込む(domain)
NSのIPアドレスはマニフェストで定義した独自定義変数を埋め込む(nameserver01とnameserver02)
テンプレートファイル
search <%= domain %> nameserver <%= nameserver01 %> nameserver <%= nameserver02 %>
facter変数
以下コマンドで出力されたものが代入される。
facter domain
マニフェスト独自変数定義
class common { resolv_conf{resolv: nameserver01 => '10.0.53.1', nameserver02 => '10.0.53.2', }
Chef
ドメインはohai変数を埋め込む(domain)
NSのIPアドレスはレシピで定義した独自定義変数を埋め込む(nameserver01とnameserver02)
テンプレートファイル
search <%= node['domain'] %> nameserver <%= @nameserver01 %> nameserver <%= @nameserver02 %>
Puppetはfacter変数も独自定義変数もテンプレートファイルに埋め込む書式は一緒だったが、
Chefはohai変数と独自定義変数は書式が異なる。
ohai変数
以下コマンドで出力されたものが代入される。
ohai domain
変数をAttribute化
default['resolv']['nameserver01'] = '10.0.53.1' default['resolv']['nameserver02'] = '10.0.53.2'
attribute化した変数をレシピで定義
template '/etc/resolv.conf' do source 'etc/resolv.conf.erb' group 'root' owner 'root' mode '0644' variables( :nameserver01 => node['resolv']['nameserver01'], :nameserver02 => node['resolv']['nameserver02'] ) end