Your SlideShare is downloading. ×
0
Puppet Best Practices? at COOKPAD
Puppet Best Practices? at COOKPAD
Puppet Best Practices? at COOKPAD
Puppet Best Practices? at COOKPAD
Puppet Best Practices? at COOKPAD
Puppet Best Practices? at COOKPAD
Puppet Best Practices? at COOKPAD
Puppet Best Practices? at COOKPAD
Puppet Best Practices? at COOKPAD
Puppet Best Practices? at COOKPAD
Puppet Best Practices? at COOKPAD
Puppet Best Practices? at COOKPAD
Puppet Best Practices? at COOKPAD
Puppet Best Practices? at COOKPAD
Puppet Best Practices? at COOKPAD
Puppet Best Practices? at COOKPAD
Puppet Best Practices? at COOKPAD
Puppet Best Practices? at COOKPAD
Puppet Best Practices? at COOKPAD
Puppet Best Practices? at COOKPAD
Puppet Best Practices? at COOKPAD
Puppet Best Practices? at COOKPAD
Puppet Best Practices? at COOKPAD
Puppet Best Practices? at COOKPAD
Puppet Best Practices? at COOKPAD
Puppet Best Practices? at COOKPAD
Puppet Best Practices? at COOKPAD
Puppet Best Practices? at COOKPAD
Puppet Best Practices? at COOKPAD
Puppet Best Practices? at COOKPAD
Puppet Best Practices? at COOKPAD
Puppet Best Practices? at COOKPAD
Puppet Best Practices? at COOKPAD
Puppet Best Practices? at COOKPAD
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Puppet Best Practices? at COOKPAD

5,805

Published on

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

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

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

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

×