Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Puppet on AWS

4,925 views

Published on

Published in: Technology
  • Sex in your area is here: ❤❤❤ http://bit.ly/2F4cEJi ❤❤❤
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

Puppet on AWS

  1. 1. Puppet on AWS + α
  2. 2. 自己紹介菅原 元気● クックパッド勤務● インフラエンジニア● @sgwr_dts● id:winebarrel
  3. 3. 宣伝OSS公開しています!● Bitbucket○ https://bitbucket.org/winebarrel● GitHub○ https://github.com/cookpad○ elasticfox-ec2tag、R53 Fox、IAM Fox● RubyGems.org○ http://rubygems.org/profiles/winebarrel
  4. 4. 宣伝最近ddbcliというものを作りました!https://bitbucket.org/winebarrel/ddbcliPlease try it out!
  5. 5. クックパッドについてレシピサイトです!以下略)
  6. 6. 本題
  7. 7. Puppetについて
  8. 8. PuppetについてクックパッドではPuppetを使っていますPuppetとは● システム構成管理ツール○ http://puppetlabs.com/puppet/puppet-open-source/● 最近はChefばかりが流行ってます● OpsWorksもChefなのでオワコン感Up!
  9. 9. PuppetについてPuppet Labs曰く"Opscodeがここまでのスケール性に達したことは印象的ですが,当社ではすでに3~4年前から,このようなスケールレベルに達しています。"Facebook,Web層管理にChefを導入http://www.infoq.com/jp/news/2013/03/facebook-chef
  10. 10. リポジトリ構成
  11. 11. リポジトリ構成設定ファイル等はほとんどGHEで管理
  12. 12. リポジトリ構成言語の比率はこんな感じ…
  13. 13. リポジトリ構成infra/├── bin├── capvars├── config│ └── deploy├── ec2-init│ ├── bin│ ├── repos│ │ └── centos6│ │ └── rpmbuild│ │ └── RPMS -> ../../../../rpm/RPMS│ └── scripts├── fluentd-proxy├── haproxy├── maintenance├── nagios├── page-cache├── page-cache-misc├── puppet│ ├── bin│ ├── lib│ ├── manifests│ ├── modules│ ├── roles│ └── types├── rpm│ ├── RPMS│ │ ├── noarch│ │ └── x86_64│ ├── SPECS│ └── SRPMS├── rproxy└── search-cache
  14. 14. リポジトリ構成infra/├── bin├── capvars├── config│ └── deploy├── ec2-init│ ├── bin│ ├── repos│ │ └── centos6│ │ └── rpmbuild│ │ └── RPMS -> ../../../../rpm/RPMS│ └── scripts├── fluentd-proxy├── haproxy├── maintenance├── nagios├── page-cache├── page-cache-misc├── puppet│ ├── bin│ ├── lib│ ├── manifests│ ├── modules│ ├── roles│ └── types├── rpm│ ├── RPMS│ │ ├── noarch│ │ └── x86_64│ ├── SPECS│ └── SRPMS├── rproxy└── search-cache
  15. 15. リポジトリ構成puppet/├── bin├── lib├── manifests│ └── site.pp├── modules│ ├...│ ├── nginx│ │ └── manifests│ │ └── init.pp│ ...├── roles│ ├── dns_internal│ │ ├── files│ │ │ └── etc│ │ │ └── pdns│ │ │ ├── ...│ │ │ ├── named.ca│ │ │ └── named.conf│ │ ├── manifests│ │ │ └── init.pp│ │ └── templates│ │ ├── ...│ │ └── usr│ │ └── local│ │ └── sbin│ │ ├── update-dns-rev│ ... ...└── types├── gem.pp├── sources.pp├── template.pp...
  16. 16. サーバ・プロビジョニング
  17. 17. サーバ・プロビジョニングプロビジョニングの流れ1. Base AMIからインスタンスを起動2. インスタンスにログインしてec2-initを実行3. puppetを実行
  18. 18. サーバ・プロビジョニングElasticfoxからBase AMIを起動
  19. 19. サーバ・プロビジョニングBase AMI● CentOS 6.2● 最小限のパッケージをインストール● 最低限のネットワーク設定、不要なサービス等の無効化、不要グループの削除、ipv6の無効化、公開鍵の取得の設定…etc
  20. 20. サーバ・プロビジョニングBase AMI● エフェメラルディスクを自動アタッチ● /tmp、swapはエフェメラルディスクを使用
  21. 21. サーバ・プロビジョニングインスタンスにログインしてec2-initを実行ec2-init: 初期処理を行うスクリプト● ネットワーク設定(DNS、route…)● yumの設定● Rubyのインストール(1.8/1.9/2.0/ree)● Puppetのインストール● TerminateProtectionの有効化● ...etc
  22. 22. サーバ・プロビジョニングec2-initの仕組み
  23. 23. サーバ・プロビジョニングPuppet● Puppet 2.7○ Ruby 1.9/2.0対応を追加
  24. 24. サーバ・プロビジョニングPuppetの仕組み
  25. 25. Puppet+AWS
  26. 26. Puppet+AWSExternal Node Classifiershttp://docs.puppetlabs.com/guides/external_nodes.htmlノード(サーバ)の設定を動的に定義する仕組み
  27. 27. Puppet+AWSExternal Node Classifiers
  28. 28. Puppet+AWSメタ情報はタグで管理とあるDBサーバのタグ
  29. 29. Puppet+AWSPuppetで利用するタグ● Role○ そのサーバに適用するロール・モジュール複数設定可能● Params[xxx]○ Puppetに渡す任意の変数● PuppetApplied○ Puppet適用日時
  30. 30. Puppet
  31. 31. Puppetマニフェストmodules/├─ maatkit│ └── manifests│ └── init.pp├─ mysql55...roles/├─ db_server│ ├── files/usr/bin│ │ └── summary-mysqldump..│ ├── manifests│ │ └── init.pp│ └── templates│ └── etc│ └── my.cnf├── app_server├── git_server...class db_server {include mysql55include mysql55_serverinclude maatkitinclude innotopuser_and_home { yamada:uid => 10001,authorized_keys => ...,}template { /etc/my.cnf:owner => root, mode => 644,}source { /usr/bin/summary-mysqldumpslow:onwer => root, mode => 700,}cron { summary-slow-log:command => /usr/bin/summary-mysqldumpslow,user => root, minute => */5,}
  32. 32. Puppetテンプレート# my.cnf[client]port = <%= port %>socket = /var/lib/mysql/mysql.sockdefault-character-set = utf8# The MySQL server[mysqld]max_connect_errors = 999999999port = <%= port %>socket = /var/lib/mysql/mysql.socklog-error = /var/lib/mysql/mysqld.errpid-file = /var/lib/mysql/mysqld.pid<% if role =~ /slave/ %>replicate-ignore-table<% end %>...
  33. 33. Puppet設計・運用方針● すべてのサーバをPuppetで管理する。例外は作らない
  34. 34. 設計・運用方針● RoleとModuleで管理○ Role: サーバの役割(app_server、git_server...)○ Module: ミドルウエアやツール群の集まり(nginx、mysql_server、zlib...)Puppet
  35. 35. 設計・運用方針● Roleはbase+個別ロールで管理○ base: すべてのサーバに適用されるロール○ 個別ロール: サーバ毎の設定が定義されたロールPuppet
  36. 36. Puppet設計・運用方針● 継承は使わない(Puppetの鬼門!)● その代わりModuleをこまか〜く定義
  37. 37. Puppet設計・運用方針● Puppetの適用はまめに行う(放置しない)● サーバのrefresh/restart/reloadはなるべく定義しない○ オンラインでpuppetを適用できるようにする
  38. 38. Puppet設計・運用方針● パッケージのインストールは必ずバージョンを指定● メジャーバージョンはModuleを分けて管理(mysql_5_5_server、mysql_5_6_server..)package { zlib:ensure => 1.2.3,}
  39. 39. Puppet設計・運用方針● Puppet自身の管理をしない● Rubyの管理をしない
  40. 40. Puppet設計・運用方針どーしてもPuppetで管理できないときは…● manifestにコメントを書く● puppet実行時にメッセージを出すshell> sudo puppet-applyinfo: Caching catalog for my-server-001.vpc.ap-northeast-1.compute.internalinfo: Applying configuration version 1368608841...notice: /Stage[main]/Ruby_notify/Exec[ruby19_notify]/returns: Please update ruby-1.9.3 (runyum clean all; yum update ruby-1.9.3.p392-3ckpd)...template { /etc/my.cnf:owner => ..., mode => ...,}# XXXを手動でインストールすること!...
  41. 41. Puppetその他Tips的なこと● Custom Typeの活用○ http://docs.puppetlabs.com/guides/custom_types.htmldefine template($mode, $owner, $group = $owner, $source = $name) {file { "$name":ensure => present,mode => "$mode", owner => "$owner", group => "$group",content => template("${module_name}$source"),}}...template { my.cnf:owner => ...,mode => ...,}
  42. 42. Puppetその他Tips的なこと● Parameterized Classesの活用○ http://docs.puppetlabs.com/guides/parameterized_classes.htmlclass mysql_server($include_my_cnf = true) {if $include_my_cnf {source { "/etc/my.cnf":owner => ..., mode => ...,}}...class db {# include mysql_serverclass { mysql_server:include_my_cnf => false,}
  43. 43. Puppetその他Tips的なこと● Custom Functionsの活用○ http://docs.puppetlabs.com/guides/custom_functions.htmlnewfunction(:mysql_server_id, :type => :rvalue) do |args|ip_addr = lookupvar(ipaddress)ip_addr = IPAddr.new(ip_addr)# IPアドレスは下位16ビットを整数値として使うip_addr = (ip_addr.to_i & 0xFFFF)server_id = %02d%03d%05d % [0, # 0〜41の連番392, # 国コード(http://ja.wikipedia.org/wiki/ISO_3166-1_numeric)ip_addr,]# 先頭の0は削除server_id.sub!(/A0+/, )return server_idend# my.cnfserver-id = <%= scope.function_mysql_server_id %>
  44. 44. Puppetその他Tips的なこと● Puppetの適用はログインしてコマンド実行するか、capistranoを使用○ capistranoはAWSからサーバ情報を取得shell> cap puppet noop ROLES=any_roletriggering load callbacksexecuting `puppettriggering start callbacks for `noopexecuting `multistage:ensureexecuting `noopexecuting "sudo -p sudo password: /usr/sbin/puppet-noop"servers: server-001..004, db-001..003Password:[server-001] info: Caching catalog for server-001[server-003] info: Caching catalog for server-003[server-001] info: Applying configuration version 1368614218
  45. 45. Puppetその他Tips的なこと● クライアントのコマンドをスクリプト化● pupept-noop、puppet-apply○ apply終了後に日時タグをつける○ restart/reloadなど危険な処理に色付けpuppet agent --no-daemonize -l console -o -v --noop --test
  46. 46. Puppetその他Tips的なこと● execは基本的にCustom Typeでラップ○ onlyif・unlessで多重実行防止● daemonizeは未使用(使ってる人いる?)
  47. 47. Puppetその他Tips的なこと● タグAPI情報は内部でキャッシュ(DescribeTagsは叩きすぎるとエラーが)● タグにメタ情報を詰め込みすぎてそろそろ足りなくなりそう…
  48. 48. Puppetドキュメント● Type Reference○ http://docs.puppetlabs.com/references/latest/type.html● Style Guide○ http://docs.puppetlabs.com/guides/style_guide.html● Best practices○ http://docs.puppetlabs.com/guides/best_practices.html● Wiki○ http://projects.puppetlabs.com/projects/puppet/wiki/● Puppet Forge○ https://forge.puppetlabs.com/
  49. 49. Puppet以外
  50. 50. Puppet以外デプロイの粒度が異なるものはPuppetで管理しない● httpd、varnish、haproxy、nagios…etc○ 設定ファイルの配置・configtest・reload○ サービスイン・サービスアウト○ キャッシュのクリア○ デプロイのロック・アンロック○ ...etc
  51. 51. Puppet以外デプロイの粒度が異なるものはPuppetで管理しない● GHE+capistranoで管理・運用shell> cap haproxy deploy configtest ROLES=foo-balancer
  52. 52. Puppet以外Puppet以外の仕組み
  53. 53. Puppet以外Tips的なもの● Multistage Extension○ https://github.com/capistrano/capistrano/wiki/2.x-Multistage-Extensionshell> cap haproxy deploy configtest ROLES=foo-balancerconfig/├── deploy│ ├── app.rb│ ├── autoscale.rb│ ├── cache.rb│ ├── dns.rb│ ├── ec2-init.rb│ ├── haproxy.rb│ ├── help.rb│ ├── nagios.rb│ ...└── deploy.rb
  54. 54. Puppet以外Tips的なもの● bracecomp○ https://rubygems.org/gems/bracecompshell> cap haproxy deploy configtest HOSTS="balancer-{001..010}"
  55. 55. Puppet以外Tips的なもの● ERB: デプロイ時にERBを展開task :make_haproxy_cfg dorun %!ruby -rerb -e puts ERB.new(ARGF.read, nil, "-").result #{current_release}/haproxy.cfg.erb > #{current_release}/haproxy.cfg!endendnamespace :deploy dotask :finalize_update domake_haproxy_cfgdiff_previousend...# haproxy.cfg.erb...<%- hosts = {db-001 => 100, ... } -%listen dbbind :3306mode tcp<%- hosts.each do |host, weight| -%>server <%= host %> <%= host %>:3306 check port 3306 inter 5s fall 3 weight <%= weight %><%- end -%>...
  56. 56. そんな感じで運用してます…
  57. 57. お約束的なアレ
  58. 58. インフラエンジニアを募集中!『クックパッド インフラエンジニア』で検索!http://info.cookpad.com/jobs/position/server-system-engineer
  59. 59. 以上です!

×