Puppet on AWS

3,982
-1

Published on

Published in: Technology

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. 以上です!

×