0
(株) paperboy&co. 宮下 剛輔 2009/12/3
自己紹介 <ul><li>宮下 剛輔 </li></ul><ul><ul><li>mizzy, id:MIZZY </li></ul></ul><ul><ul><li>gosukenator(twitter, gmail) </li></ul>...
 
 
アジェンダ <ul><li>エラー通知 </li></ul><ul><li>ノード情報管理 </li></ul><ul><li>クラス </li></ul><ul><li>exec リソース </li></ul><ul><li>モジュール化 <...
 
エラー通知 <ul><li>Puppet にはエラーだけ通知する仕組みがない? </li></ul><ul><ul><li>tagmail は特定のクラスに関するログの通知先アドレスを指定できるが、エラーのみ通知、ということができない </li...
エラー通知 <ul><li>puppet.conf </li></ul><ul><li>[puppetd] </li></ul><ul><li>syslogfacility = local0 </li></ul><ul><li>syslog.c...
 
ノード情報管理 <ul><li>最初は LDAP でやってみた </li></ul><ul><li>イマイチだった </li></ul><ul><li>LDAP でノード管理するメリットがあまりない </li></ul><ul><li>LDAP...
ノード管理 <ul><li>現在は Cobbler を利用 </li></ul><ul><li>Cobbler ではノード情報の登録が必須で、それを Puppet にも流用できて一石二鳥 </li></ul><ul><li>Cobbler は ...
external nodes 設定 <ul><li>/etc/puppet/puppet.conf での設定 </li></ul><ul><li>[puppetmasterd] </li></ul><ul><li>external_nodes ...
cobbler-ext-nodes コマンド <ul><li>以下のような情報を返す </li></ul><ul><li>$ cobbler-ext-nodes  </li></ul><ul><li>smtp.lolipop.jp </li><...
 
クラスの分け方 <ul><li>サーバの役割別 </li></ul><ul><ul><li>サーバの役割に応じたクラス分け </li></ul></ul><ul><ul><li>粒度は大きめ </li></ul></ul><ul><ul><li...
リソースの重複 <ul><li>class   web  { </li></ul><ul><li>package  { ‘httpd’: ensure => present } </li></ul><ul><li>} </li></ul><ul...
もう一つのクラスの分け方 <ul><li>機能別 </li></ul><ul><ul><li>役割よりも更に粒度を小さく機能に分解 </li></ul></ul><ul><ul><li>httpd, smtpd, storage-api, st...
 
exec 脳の恐怖 <ul><li>構築の自動化をスクリプトでやってると、 Puppet を導入しても、何でも exec で実行してしまおうとする </li></ul><ul><li>exec で実行してしまうと、何度実行しても同じ結果になる、...
exec を濫用したマニフェスト <ul><li>exec  {  'sysctl add': </li></ul><ul><li>command  =>  'echo &quot;net.ipv4.netfilter.ip_conntrack...
exec を適切に利用したマニフェスト <ul><li>file  {  '/etc/sysctl.conf': </li></ul><ul><li>ensure   =>  present, </li></ul><ul><li>source ...
 
モジュール化で使えるテクニック <ul><li>http://trombik.mine.nu/~cherry/w/   の trom </li></ul><ul><li>bik さんに教えて頂いたテクニック </li></ul><ul><li>...
モジュールの定義 <ul><li>class   apache_defaults  { </li></ul><ul><li>$ssl  =  true </li></ul><ul><li>} </li></ul><ul><li>class   ...
ノード定義でデフォルト値を上書き <ul><li>node   &quot;sample1.example.com&quot;  { </li></ul><ul><li>class   apache_config   inherits   ap...
デフォルト値を使う場合 <ul><li>node   &quot;sample1.example.com&quot;  { </li></ul><ul><li>class   apache_config   inherits   apache_...
ノード定義内でのクラス定義 <ul><li>この方法は、ノードをファイルで管理してる場合じゃないと使えない </li></ul><ul><li>なので、 external-nodes  では使えない </li></ul>
 
ノード定義で正規表現が利用できる <ul><li>0.25.0 からの機能 </li></ul><ul><li>node   /^wwwd+$/  { </li></ul><ul><li>include   common </li></ul><...
配列への追加 <ul><li>0.24.6 からの機能 </li></ul><ul><li>$ssh_users  = [ 'myself' ,  'someone' ] </li></ul><ul><li>class   test  { </...
セレクタでの正規表現とキャプチャ <ul><li>0.25 からの機能 </li></ul><ul><li>$system  =  $operatingsystem  ? { </li></ul><ul><li>/(redhat|debian)...
ケースでの正規表現とキャプチャ <ul><li>0.25 からの機能 </li></ul><ul><li>case  $hostname { </li></ul><ul><li>/^j(ack|ill)$/ :   </li></ul><ul>...
if での比較演算 <ul><li>0.24.6 からの機能 </li></ul><ul><li>if  $server  ==  &quot;mongrel&quot;  { </li></ul><ul><li>include   mongr...
 
Upcoming SlideShare
Loading in...5
×

Puppet Best Practices? at COOKPAD

5,839

Published on

Published in: Technology
0 Comments
13 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
5,839
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
52
Comments
0
Likes
13
Embeds 0
No embeds

No notes for slide

Transcript of "Puppet Best Practices? at COOKPAD"

  1. 1. (株) paperboy&co. 宮下 剛輔 2009/12/3
  2. 2. 自己紹介 <ul><li>宮下 剛輔 </li></ul><ul><ul><li>mizzy, id:MIZZY </li></ul></ul><ul><ul><li>gosukenator(twitter, gmail) </li></ul></ul><ul><li>http://mizzy.org/ </li></ul><ul><li>ペパボで技術責任者というのをやってます </li></ul><ul><li>子だくさん </li></ul><ul><ul><li>11/24 に 4 人目が生まれました </li></ul></ul><ul><li>主に Perl 界隈で活動してます </li></ul><ul><ul><li>が、最近停滞気味… </li></ul></ul><ul><li>ドクターペッパー好きとして一部で知られてます </li></ul>
  3. 5. アジェンダ <ul><li>エラー通知 </li></ul><ul><li>ノード情報管理 </li></ul><ul><li>クラス </li></ul><ul><li>exec リソース </li></ul><ul><li>モジュール化 </li></ul><ul><li>最近の機能追加 </li></ul>
  4. 7. エラー通知 <ul><li>Puppet にはエラーだけ通知する仕組みがない? </li></ul><ul><ul><li>tagmail は特定のクラスに関するログの通知先アドレスを指定できるが、エラーのみ通知、ということができない </li></ul></ul><ul><ul><li>正常なログを送ってもらってもうざいだけ </li></ul></ul><ul><li>なので、別の方法を考える </li></ul><ul><ul><li>syslog 設定で、 err 以上のレベルのログを分離してやると、あとはどうにでもできる </li></ul></ul>
  5. 8. エラー通知 <ul><li>puppet.conf </li></ul><ul><li>[puppetd] </li></ul><ul><li>syslogfacility = local0 </li></ul><ul><li>syslog.conf </li></ul><ul><li>local0.err;local0.crit;local0.alert;local0.emerg </li></ul><ul><li>/var/log/puppet/error.log </li></ul>
  6. 10. ノード情報管理 <ul><li>最初は LDAP でやってみた </li></ul><ul><li>イマイチだった </li></ul><ul><li>LDAP でノード管理するメリットがあまりない </li></ul><ul><li>LDAP に精通してる人がいない </li></ul>
  7. 11. ノード管理 <ul><li>現在は Cobbler を利用 </li></ul><ul><li>Cobbler ではノード情報の登録が必須で、それを Puppet にも流用できて一石二鳥 </li></ul><ul><li>Cobbler は dnsmasq と連携できるので、 DNS/DHCP にもノード情報が使える </li></ul><ul><li>cobbler-ext-nodes コマンドが付属していて、即 Puppet と連携できる </li></ul>
  8. 12. external nodes 設定 <ul><li>/etc/puppet/puppet.conf での設定 </li></ul><ul><li>[puppetmasterd] </li></ul><ul><li>external_nodes = /usr/bin/cobbler-ext-nodes </li></ul><ul><li>node_terminus = exec </li></ul>
  9. 13. cobbler-ext-nodes コマンド <ul><li>以下のような情報を返す </li></ul><ul><li>$ cobbler-ext-nodes </li></ul><ul><li>smtp.lolipop.jp </li></ul><ul><li>classes : [base, smtp] </li></ul><ul><li>parameters : {from_cobbler: 1, tree: 'http://@@http_server@@/cblr/links/CentOS5.3-x86_64'} </li></ul>
  10. 15. クラスの分け方 <ul><li>サーバの役割別 </li></ul><ul><ul><li>サーバの役割に応じたクラス分け </li></ul></ul><ul><ul><li>粒度は大きめ </li></ul></ul><ul><ul><li>web, app, batch, storage, db-master, db-slave, reverse-proxy </li></ul></ul><ul><ul><li>メリット </li></ul></ul><ul><ul><ul><li>サーバの役割をひとつにしておけば、 include するクラスはひとつなので、リソースの重複がない </li></ul></ul></ul><ul><ul><li>デメリット </li></ul></ul><ul><ul><ul><li>一時的に別の役割も兼ねる、といったことが柔軟にできない </li></ul></ul></ul><ul><ul><ul><li>重複しやすそう </li></ul></ul></ul>
  11. 16. リソースの重複 <ul><li>class web { </li></ul><ul><li>package { ‘httpd’: ensure => present } </li></ul><ul><li>} </li></ul><ul><li>class reverse-proxy { </li></ul><ul><li>package { ‘httpd’: ensure => present } </li></ul><ul><li>} </li></ul><ul><li>node hoge { </li></ul><ul><li>include web, reverse-proxy </li></ul><ul><li>↑ httpd リソースが重複して怒られる </li></ul><ul><li>} </li></ul>
  12. 17. もう一つのクラスの分け方 <ul><li>機能別 </li></ul><ul><ul><li>役割よりも更に粒度を小さく機能に分解 </li></ul></ul><ul><ul><li>httpd, smtpd, storage-api, storage-tracker, storage-node </li></ul></ul><ul><ul><li>メリット </li></ul></ul><ul><ul><ul><li>リソースが重複しにくいので、一時的に別の役割を兼ねる、といったこともやりやすい </li></ul></ul></ul><ul><ul><ul><li>アクセスが少ないうちは兼用、増えたら兼用をやめる、といったことができる </li></ul></ul></ul><ul><ul><li>デメリット </li></ul></ul><ul><ul><ul><li>リソース重複しないようにマニフェスト定義するのが面倒 </li></ul></ul></ul><ul><ul><ul><li>virtual リソースを使いまくることになる </li></ul></ul></ul>
  13. 19. exec 脳の恐怖 <ul><li>構築の自動化をスクリプトでやってると、 Puppet を導入しても、何でも exec で実行してしまおうとする </li></ul><ul><li>exec で実行してしまうと、何度実行しても同じ結果になる、という保証がないので危険 </li></ul><ul><li>マニフェストは「実行」するものではなく「適用」するもの、と捉えるべき </li></ul><ul><li>exec を濫用するとマニフェストのメンテもしづらくなる </li></ul>
  14. 20. exec を濫用したマニフェスト <ul><li>exec { 'sysctl add': </li></ul><ul><li>command => 'echo &quot;net.ipv4.netfilter.ip_conntrack_max = 131072&quot; >> /etc/sysctl.conf </li></ul><ul><li>&& /sbin/sysctl -p', </li></ul><ul><li>onlyif => &quot;test -f /etc/sysctl.conf&quot;, </li></ul><ul><li>unless => &quot;grep 'net.ipv4.netfilter.ip_conntrack_max' /etc/sysctl.conf 2>/dev/null&quot; </li></ul><ul><li>} </li></ul>
  15. 21. exec を適切に利用したマニフェスト <ul><li>file { '/etc/sysctl.conf': </li></ul><ul><li>ensure => present, </li></ul><ul><li>source => &quot;puppet://$server/sysctl.conf&quot;, </li></ul><ul><li>} </li></ul><ul><li>exec { '/sbin/sysctl -p': </li></ul><ul><li>subscribe => File['/etc/sysctl.conf'], </li></ul><ul><li>refreshonl y => true, </li></ul><ul><li>} </li></ul>
  16. 23. モジュール化で使えるテクニック <ul><li>http://trombik.mine.nu/~cherry/w/ の trom </li></ul><ul><li>bik さんに教えて頂いたテクニック </li></ul><ul><li>モジュールでデフォルト値を定義しつつ、ノード固有の値で上書きしようとすると、普通のやり方では怒られるので、それを回避する方法をご紹介 </li></ul>
  17. 24. モジュールの定義 <ul><li>class apache_defaults { </li></ul><ul><li>$ssl = true </li></ul><ul><li>} </li></ul><ul><li>class apache inherits apache_config { </li></ul><ul><li>$ssl_flag = $ssl ? { </li></ul><ul><li>false => &quot;&quot;, </li></ul><ul><li>default => &quot;-DSSL&quot; </li></ul><ul><li>} </li></ul><ul><li>... </li></ul><ul><li>} </li></ul>
  18. 25. ノード定義でデフォルト値を上書き <ul><li>node &quot;sample1.example.com&quot; { </li></ul><ul><li>class apache_config inherits apache_defaults { </li></ul><ul><li>$ssl = false </li></ul><ul><li>} </li></ul><ul><li>include apache </li></ul><ul><li>} </li></ul>
  19. 26. デフォルト値を使う場合 <ul><li>node &quot;sample1.example.com&quot; { </li></ul><ul><li>class apache_config inherits apache_defaults { } </li></ul><ul><li>include apache </li></ul><ul><li>} </li></ul>
  20. 27. ノード定義内でのクラス定義 <ul><li>この方法は、ノードをファイルで管理してる場合じゃないと使えない </li></ul><ul><li>なので、 external-nodes では使えない </li></ul>
  21. 29. ノード定義で正規表現が利用できる <ul><li>0.25.0 からの機能 </li></ul><ul><li>node /^wwwd+$/ { </li></ul><ul><li>include common </li></ul><ul><li>} </li></ul>
  22. 30. 配列への追加 <ul><li>0.24.6 からの機能 </li></ul><ul><li>$ssh_users = [ 'myself' , 'someone' ] </li></ul><ul><li>class test { </li></ul><ul><li>$ssh_users += [ 'someone_else' ] </li></ul><ul><li>} </li></ul>
  23. 31. セレクタでの正規表現とキャプチャ <ul><li>0.25 からの機能 </li></ul><ul><li>$system = $operatingsystem ? { </li></ul><ul><li>/(redhat|debian)/ </li></ul><ul><li>=> &quot;our system is $1 &quot; , </li></ul><ul><li>default </li></ul><ul><li>=> &quot;our system is unknown&quot; , </li></ul><ul><li>} </li></ul>
  24. 32. ケースでの正規表現とキャプチャ <ul><li>0.25 からの機能 </li></ul><ul><li>case $hostname { </li></ul><ul><li>/^j(ack|ill)$/ : </li></ul><ul><li>{ notice( &quot;Welcome $1 !&quot; ) } </li></ul><ul><li>default : </li></ul><ul><li>{ notice( &quot;Welcome stranger&quot; ) } </li></ul><ul><li>} </li></ul>
  25. 33. if での比較演算 <ul><li>0.24.6 からの機能 </li></ul><ul><li>if $server == &quot;mongrel&quot; { </li></ul><ul><li>include mongrel </li></ul><ul><li>} else { </li></ul><ul><li>include nginx </li></ul><ul><li>} </li></ul>
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×