えいのうにっき

a-knowの日記です

ようやく itamae の使い方が固まってきたのでメモ

ここで書いている内容は、基本的には Chef-soloからItamaeに完全移行した話 - Qiita を参考にしているもの。あとは GitHub - toritori0318/itamae-sample-project: itamae-sample-projectBest Practice · itamae-kitchen/itamae Wiki · GitHub あたりも、かな。

そのやり方で itamae を使う場合、どんなレシピを適用するときでも、こんな↓かんじで起動する。

$ bundle exec itamae ssh -h www.example.com -j nodes/production.json -u a-know entrypoint.rb

entrypoint.rb の中身は以下のようなかんじになってる。

node["recipes"] = node["recipes"] || []

node["recipes"].each do |recipe|
  include_recipe recipe
end

node["recipes"] の要素ぶんだけ、include_recipe している。

node には、itamae 起動時に -j で指定した json ファイル(YAMLファイルを用いる場合は -y)の内容が hash で入ってる。通常は attribute を指定するために使うものだと思うんだけど、今回の使い方だとその中身は、例えばこんな↓かんじ。

{
    "mackerel": {
        "service_role": "service_name:role_name"
    },
    "recipes": [
      "./roles/base.rb",
      "./roles/production.rb"
    ]
}

じゃあ roles/base.rb とかにはどんなことが書いてあるの、ってことなんだけど、↓こんなかんじ。

include_recipe '../cookbooks/selinux.rb'
include_recipe '../cookbooks/timezone.rb'
include_recipe '../cookbooks/mackerel.rb'

ここでも include_recipeinclude_recipe の入れ子。なるほどなーというかんじ。

もちろん、通常の node としての利用(attribute としての使い方)もできる。

template '/etc/mackerel-agent/mackerel-agent.conf' do
  owner 'root'
  group 'root'
  mode '0644'
  source '../../files/mackerel/mackerel-agent.conf.erb'
  variables service_role: node['mackerel']['service_role']
  notifies :restart, 'service[mackerel-agent]'
end

つまり、

  • 適用したいロールを、json ファイル内の recipes 要素で指定する
  • ロール毎に適用したいレシピは、roles/hoge.rbinclude_recipe を列挙することで指定する

という形。どのレシピを適用するときでも、itamae ssh に食わせるものは常に entrypoint.rb でよく、適用したいレシピのコントロールは roles/hoge.rbnodes/hoge.json でできるっていうのが、僕には嬉しいかんじ。

秘匿情報の管理には GitHub - sorah/itamae-secrets: Encrypted Data Bag for Itamae を使う。

github.com

$ itamae-secrets newkey --base=./secret --method=aes-random で秘密鍵を作って(これは漏らしてはいけないやつ。公開リポジトリに push したりしないよう気をつけよう)、$ itamae-secrets set --base=./secret <secret値の種類の名前> <暗号化したい値> というかんじで秘匿情報を暗号化する。

暗号化した情報は、レシピ内で以下のようにすれば読める。

require 'itamae/secrets'
node[:secrets] = Itamae::Secrets(File.join(__dir__, 'secret'))

# Use it
p node[:secrets][<secret値の種類の名前>]

というかんじ

長らく chef-solo を使ってきた僕だけど、これくらいがちょうどよいかんじがある。もう少し規模が大きくなったり、チーム開発するってなったら、あきらめて chef を使うか、GitHub - sonots/kondate: Kondate is yet another nodes management framework for Itamae/Serverspec とかを使うのがいいのかも。

Infrastructure as Code ―クラウドにおけるサーバ管理の原則とプラクティス

Infrastructure as Code ―クラウドにおけるサーバ管理の原則とプラクティス

  • 作者:Kief Morris
  • 発売日: 2017/03/18
  • メディア: 単行本(ソフトカバー)