Itamae meetup #1 ( #itamae_meetup ) で「Itamaeで幸せになった話」をLTしてきた


Itamae meetup #1

Itamae@ryot_a_rai くんの作ったプロビジョニングツールです。要は軽量版 Chef だと思えば大体あってます。で、めでたく meetup の第一回が開催されるということで、LT 枠でクックパッド社にお邪魔してきました。

話したこと

LT ということでかなり端折った資料になっているため、資料だけ見てもよくわからないかもしれません。資料に書いていないこと、発表で話せなかったことを補足しつつまとめます。

導入の背景

  • 以前は Chef が使われていたが、リポジトリが分散し、かつ依存があってカオスであった
  • 整理するくらいなら作りなおしたほうがはやい
  • Chef はやりたいことに大して大げさすぎる
  • Ansible は冪等性を維持する書き方がすっきりかけなくてダルい
  • Puppet は使いはじめるまでに覚えることが多すぎる
  • 知り合いが作っている OSS であればいろいろ安心

SmartNews における事例

  1. Github に push
  • 大きめの修正を入れた時はpacker で AMI を build して、AutoScalingGroup に設定する
  1. CircleCI で共通部分のテストしたのち、S3 に zip して upload
  2. AutoScalingGroup で管理されている EC2 インスタンスが、起動時に zip を download し、自分のタグから role を判定して itamae local を実行
  • 手動で即時反映したければ Fabric を叩く(この時も itamae ssh はしてなくて、各インスタンスが zip 落としてきて itamae local です
  • あるいは AutoScalingGroup のインスタンスを総入れ替えするコマンドを作ってあるので、そいつを叩く

Directory 構成

基本的に Best Practice 構成

.
├── ci
├── cookbooks -> packer/cookbooks
├── fabfile
├── nodes -> packer/nodes
├── packer
│   ├── cookbooks
│   │   ├── admin
│   │   ├── common
│   │   ├── dd_agent
│   │   ├── docker
│   │   ├── pipelinedb
│   │   └── (snip)
│   ├── nodes
│   ├── roles
│   │   ├── auth-proxy
│   │   ├── forward-proxy
│   │   ├── ops-monitor
│   │   └── (snip)
│   ├── scripts
│   └── spec
│       ├── default
│       └── packer
├── roles -> packer/roles
└── spec -> packer/spec
  • nodes はインスタンス個別に yml を設定したいときにつかう想定…だったけど AutoScalingGroup 使い始めたこともあって使っていない

  • roles は一つ一つの機能の単位で、 インスタンスにつけている Group というタグと 1:1 で対応し、 AutoScalingGroup もこの role ごとに用意している

  • roles の下には default.rb とか production.rb とか staging.rb とかって置くようにしている

  • インスタンスのタグに応じて どっちを使うか決まる

  • default はどっちでも使われる

  • production.rb

node.reverse_merge!({
  java: {
    tomcat: {
      java_opts: {
        xmx: "10240m",
        xms: "10240m",
      },
      maxThreads: "512",
    },
  },
  td_agent: {
    forward: {
      smartnews_action: true
    },
  },
})

include_recipe "default.rb"
  • default.rb
node.reverse_merge!({
  app_name: "hogehoge",
  java: {
    tomcat: {
      java_opts: {
        xmx: "7680m",
        xms: "7680m",
        metaspace_size: "128m",
      },
    },
  },
  recipes: %W{
    common
    supervisor
    java
    java::tomcat
    nginx
    td_agent
    dd_agent
    dd_agent::nginx
    dd_agent::supervisor
    dd_agent::jmx
    dd_agent::fluentd
  },
})
  • なんかこんな感じになっていて、 itamae local bootstrap.rb すると bootstrap.rb の中で、上述したようなタグに応じて適切に include_recipe してくれるという構成です

まとめ

  • スモールスタートしやすいツールなので itamae おすすめです