ã¤ã³ãã©é¨ã®èäºï¼@ryot_a_raiï¼ã§ãããã®è¨äºã§ã¯ã¯ãã¯ãããã§å©ç¨ãã¦ãããããã¸ã§ãã³ã°ãã¼ã« "Itamae" ã®ç´¹ä»ã¨ç´°ã ãã Tips ãç´¹ä»ãã¾ãã
å¼å¹´é·å®®ã¨ãããã¸ã§ãã³ã°ãã¼ã«
ç¾å¨ãå¼ç¤¾ã§ã¯ã¤ã³ãã©ã®å¼å¹´é·å®®*1ãé²ãã¦ãã¾ããå¼å¹´é·å®®ä»¥åãå¼ç¤¾ã§ã¯ Puppet ãå©ç¨ãã¦ãµã¼ããã»ããã¢ãããã¦ãã¾ããããå¼å¹´é·å®®ã«éãã¦æ¢åã®ãããã¸ã§ãã³ã°ã«é¢ããã³ã¼ãã¯æ¨ã¦ããã¨ã«ãªãããããããã¸ã§ãã³ã°ãã¼ã«ã®åæ¤è¨ãè¡ããã¨ã«ãªãã¾ããã
Puppet, Chef, Ansible, SaltStack ãæ¤è¨ããçµæã
- è¨èªç¹æ§ã®è¦³ç¹ã§ã¯ãRuby DSL 㪠Chef ãè¯ã
- ã¢ã¼ããã¯ãã£ã»ã¨ã³ã·ã¹ãã ã®è¦³ç¹ã§ã¯ãã·ã³ãã«ãª Ansible ãè¯ã
ã¨ãã£ãç¹ãããã©ããæ±ºãæã«æ¬ ããç¶æ³ã§ãRuby DSL ã§è¨è¿°ã§ããã·ã³ãã«ãªãããã¸ã§ãã³ã°ãã¼ã«ãå¿ è¦ã¨ããã¦ãã¾ããã ããã§ã以åããçè ãç´°ã ã¨éçºãã¦ããItamaeï¼å½æã¯ Lightchef ã¨å¼ãã§ãã¾ããï¼ãæ¡ç¨ãããéçºãé²ãããã¾ããã
Itamae ã¨ã¯
Itamaeã¯ä¸è¨ã§è¨ãã¨ããªãã·ã³ãã«ãª Chef ã§ã以ä¸ã®ãããªç¹å¾´ãããã¾ãã
- Chefã«ããã cookbook, role, environment ãªã©ã®æ¦å¿µã¯ãªããã¬ã·ãã®ã¿ã管çãã¾ã
- ä½ãå¦ç¿ã³ã¹ãã§ä½¿ããã¨ãã§ãã¾ã
- ãããã¸ã§ãã³ã°å¯¾è±¡ã®ãµã¼ãã« Itamae ãå
¥ã£ã¦ããå¿
è¦ããªã
- SSH çµç±ã§ä»ãµã¼ãããããã¸ã§ã³ãããã¨ãå¯è½ã§ã
- Gem ã§ãã©ã°ã¤ã³ãä½ããã¨ãã§ãã
- Bundler ã®ã¿ã§ä¾åé¢ä¿ãè¨è¿°ãããã¨ãã§ãã
- Chef ã«ããã Berkshelf ã®ä»£æ¿
å ¥é Itamae
Itamae ã®ä½¿ãæ¹ã«ã¤ãã¦è»½ã触ãã¦ã¿ã¾ãã
ã¾ããRuby 㨠Bundler ãã¤ã³ã¹ãã¼ã«ãã¦ããã¦ãã ããã使¥ç¨ãã£ã¬ã¯ããªãä½ãã¾ãã
$ mkdir itamae-getting-started $ cd itamae-getting-started
Itamae ãã¤ã³ã¹ãã¼ã«ããããã« Gemfile ãç½®ãã¾ããç´æ¥gem install
ã§ã¤ã³ã¹ãã¼ã«ãããã¨ãå¯è½ã§ãããã¬ã·ããæå³ããåããªããªããªãããã« Bundler ã§ Itamae ã®ãã¼ã¸ã§ã³ãåºå®ãããã¨ããããããã¾ãããã©ã°ã¤ã³ã使ãå ´åã«ã¯ããã® Gemfile ã«ãã©ã°ã¤ã³ã追å ããã ãã§å©ç¨ã§ãã¾ãã
# Gemfile source 'https://rubygems.org' gem 'itamae'
Itamae ãã¤ã³ã¹ãã¼ã«ãã¾ãã
$ bundle install
ã¬ã·ããæ¸ãã¦ãµã¼ãã®ç¶æ ãè¨è¿°ãããã¨ãã§ãã¾ããããã§ã¯ sl ã³ãã³ããã¤ã³ã¹ãã¼ã«ãã¦ã¿ã¾ãã
# sl.rb package "sl" do action :install # ããã©ã«ãå¤ãªã®ã§çç¥å¯è½ end
$ bundle exec itamae local sl.rb INFO : Starting Itamae... INFO : Recipe: /home/ryotarai/itamae-getting-started/sl.rb INFO : package[sl] installed will change from 'false' to 'true'
ãªããSSH è¶ãã«å®è¡ããå ´åã¯ä»¥ä¸ã®ããã«å®è¡ãã¾ã
$ bundle exec itamae ssh --host host001.example.jp sl.rb
ä¸è¨ã®ã¬ã·ãã«æ¸ããã¦ããpackage
ã¯ãªã½ã¼ã¹ã¨å¼ã°ãããµã¼ãä¸ã®ä½ãããã®ãªã½ã¼ã¹ï¼ããã±ã¼ã¸ããã¡ã¤ã«ãªã©ï¼ã®ç¶æ
ãè¨è¿°ãã¾ããItamae ã«ã¯ä»ã«ãæ§ã
ãªãªã½ã¼ã¹ãç¨æããã¦ãã¾ããã代表çãªãã®ãããã¤ãç´¹ä»ãã¾ãã
# package ãªã½ã¼ã¹ package "nginx" do action :install version "..." end # remote_file ãªã½ã¼ã¹ # ãã¡ã¤ã«ãç¹å®ã®ãã¹ã«ç½®ããã¨ãã§ãã¾ã remote_file "/etc/nginx/nginx.conf" do source "nginx.conf" end # template ãªã½ã¼ã¹ # remote_file ãªã½ã¼ã¹ã¨åæ§ã§ãããeRuby (ERB)ã¨ãã¦è©ä¾¡ããçµæãæ¸ãåºãã¾ã template "/etc/nginx/conf.d/itamae" do source "itamae.erb" end # execute ãªã½ã¼ã¹ # ä»»æã®ã³ãã³ããå®è¡ãããã¨ãã§ãã¾ã execute "echo Hello >> /etc/something" do not_if "grep Hello /etc/something" # ãã®ã³ãã³ãã失æããå ´åã®ã¿å®è¡ããã¾ã # only_if "grep -v Hello /etc/something" # ãã®ã³ãã³ããæåããå ´åã®ã¿å®è¡ããã¾ã end
ã»ãã«ããªã½ã¼ã¹ãç¨æããã¦ããã®ã§ä¸åº¦ https://github.com/itamae-kitchen/itamae/wiki/Resources ã«ç®ãéãã¦ã¿ããã¨ããããããã¾ãã
ããä¸ã¤ãã使ãããæ©è½ã¨ãã¦ãã¬ã·ãããä»ã®ã¬ã·ããèªã¿è¾¼ãæ©è½ãããã¾ãã
include_recipe "sl.rb"
ä¸è¨ã®ããã«ãinclude_recipe
ã«èªã¿è¾¼ã¿ããã¬ã·ãã®ãã¹ã渡ãã¨ä»ã®ã¬ã·ããèªã¿è¾¼ããã¨ãã§ãã¾ãããã¹ã¯include_recipe
ãæ¸ããã¬ã·ãããããã£ã¬ã¯ããªããã®ç¸å¯¾ãã¹ã«ãªãã¾ãã
ã¡ãªã¿ã«ãåãã¬ã·ããè¤æ°åinclude_recipe
ãã¦ã1度ããèªã¿è¾¼ã¾ããªãããã«ãªã£ã¦ããã®ã§ããæ³¨æãã ããã
åºæ¬çãªä½¿ãæ¹ã¯ä»¥ä¸ã§ããããã ãè¦ããã°ä½¿ãå§ããããã®ã§ããã²å°å ¥ãã¦ã¿ã¦ãã ããã
ããã«è©³ããä½¿ãæ¹ãªã©ã¯ããã¥ã¡ã³ããåç §ãã¦ãã ããã
Itamae Tips
ã¯ãã¯ãããã§ã® Itamae ã®ä½¿ãæ¹ã§ç¹å¾´çãªç¹ãããã¤ãç´¹ä»ãã¾ãã
roleãcookbook
åè¿°ã®éããItamae ã«ã¯ role ã cookbook ã管çããä»çµã¿ã¯ããã¾ããããinclude_recipe
ã§ä»ã®ã¬ã·ããèªã¿è¾¼ããã¨ã§åæ§ã®æ©è½ãå®ç¾ãã¦ãã¾ãã
ä¾ãã°ã
âââ bootstrap.rb âââ cookbooks â  âââ nginx â  â  âââ default.rb â  â  âââ templates â  â  âââ etc â  â  âââ nginx â  â  âââ nginx.conf.erb â  âââ ruby â  âââ default.rb âââ roles âââ web âââ default.rb
ãã®ããã«ãcookbook 㨠role ã®ãã£ã¬ã¯ããªãç¨æãç¹å®ã®å½åè¦åã«ãããã£ã¦ãã¡ã¤ã«ãç½®ãã¦ãã¾ãã
# bootstrap.rb # 2015/05/12 10:03 ä¿®æ£ module RecipeHelper def include_cookbook(name) include_recipe File.join(__dir__, "cookbooks", name, "default.rb") end end Itamae::Recipe::EvalContext.include(RecipeHelper) include_recipe File.join("roles", node[:role], "default.rb")
# roles/web/default.rb include_cookbook "nginx" include_cookbook "ruby"
role ã¯ãµã¼ãã«ãã£ã¦ç°ãªãã®ã§ãnode[:role]
ãåç
§ãã¦å®è¡ããããã«ãã¦ãã¾ããã¯ãã¯ãããã§ã¯ EC2 ã¤ã³ã¹ã¿ã³ã¹ã®ã¿ã°ã§ role ãæå®ãã¦ããã®ã§ specinfra-ec2_metadata-tags ãå©ç¨ãã¦ãå®è¡ããã¬ã·ããæ±ºå®ãã¦ãã¾ãã
ãã®ããã«æºåãã¦ããã¨ã以ä¸ã®ããã«å®è¡ãããã¨ãã§ãã¾ãã
$ echo '{"role": "web"}' > node.json $ bundle exec itamae local --node-json=node.json bootstrap.rb
remote_file, templateã®source :auto
remote_file, template ãªã½ã¼ã¹ã«ã¯source
ã¢ããªãã¥ã¼ãããããããã§ãã¡ã¤ã«ããã³ãã¬ã¼ããæå®ãã¾ãã
$ ls recipe.rb nginx.conf.erb
# recipe.rb template "/etc/nginx/nginx.conf" do source "nginx.conf.erb" end
é常ãsource
ã«ã¯ãã¡ã¤ã«ãã¹ãæå®ãã¾ãããç¹å¥ãªå¤ã¨ãã¦:auto
ãç¨æããã¦ãã¾ãã:auto
ãæå®ãããã¨ãItamaeã¯é
ç½®å
ã®ãã¡ã¤ã«ãã¹ããèªåçã«ãã¡ã¤ã«ãæ¢ãã¾ãï¼è©³ç´°ï¼ãã¡ãªã¿ã«ãsource
ã®ããã©ã«ãå¤ã¯:auto
ãªã®ã§ãããã¯çç¥ãããã¨ãã§ãã¾ãã
âââ recipe.rb âââ templates âââ etc âââ nginx âââ nginx.conf.erb
# recipe.rb template "/etc/nginx/nginx.conf" do end
ãã®æ¹æ³ãå©ç¨ããã¨ããã£ã¬ã¯ããªæ§æããããããããªããã¡ã¤ã«ãå¢ããå ´åã«ã管çãããããªãã¨æãã¦ãã¾ãã
Node#reverse_merge!
ãã¼ãã¢ããªãã¥ã¼ãã«ããã©ã«ãå¤ãè¨å®ããå ´åã¯ãNode#reverse_merge!
ã便å©ã§ããNode#reverse_merge!
ã¯ãã§ã«å¤ãã»ããããã¦ããå ´åã¯ä¸æ¸ãããããã£ã¼ããã¼ã¸ãè¡ãã¾ãã
ä¾ãã°ã以ä¸ã®ããã«ä½¿ãã¾ãã
# recipe.rb node.reverse_merge!({ nginx: { worker_processes: 4 } }) template "/etc/nginx/nginx.conf"
$ bundle exec itamae local recipe.rb # ãã®å ´åãworker_processesã¯4ã«ãªãã¾ã $ echo '{"nginx": {"worker_processes": 8}}' > node.json $ bundle exec itamae local --node-json=node.json recipe.rb # ãã®å ´åãworker_processesã¯8ã«ãªãã¾ã
SSHã使ããªã
Itamae ã¯ã³ãã³ããå®è¡ãã¦ããã®çµæãåãåã£ã¦ãããæ¬¡ã®ã³ãã³ããå®è¡ãããããã¬ã¤ãã³ã·ãé«ããµã¼ãã«å¯¾ã㦠SSH å®è¡ãè¡ãã¨ãé ãæãããã¨ãããã¾ãããã®ãããªå ´åã¯ã対象ãµã¼ãã« Itamae ãã¤ã³ã¹ãã¼ã«ãããã¨ã§è§£æ¶ãã¾ããã¯ãã¯ãããã§ãæå㯠SSH å®è¡ã使ã£ã¦ãã¾ããããå½å¤ã®ãµã¼ããå¢ããã«ã¤ããã¬ã¤ãã³ã·ãæ°ã«ãªãããã«ãªããµã¼ãä¸ã§ã®ãã¼ã«ã«å®è¡ã«åãæ¿ãã¾ããã
ã·ã¹ãã ã«å ¥ã£ã¦ãã Ruby ã使ã£ã¦ Itamae ãã¤ã³ã¹ãã¼ã«ãããã¨ãå¯è½ã§ãããRuby ã®ãã¼ã¸ã§ã³ã¢ãããªã©ã«ãã£ã¦ Itamae ãåããªããªã£ã¦ãã¾ããã¨ãé²ããããRuby ãªã©ã®ä¾åé¢ä¿ãã¨ã¤ã³ã¹ãã¼ã«ããããã±ã¼ã¸ãç¨æãã¦ãã¾ããç¾å¨ãUbuntu 14.04 ç¨ã® Debian Package ã®ã¿ãã«ããã¦ãã¾ãããchef/omnibus ã使ã£ã¦ããã®ã§ãä»ãã£ã¹ããªãã¥ã¼ã·ã§ã³ç¨ã®ããã±ã¼ã¸ããã«ãã§ããã¨æãã¾ãã
ãªãã¬ã¼ã·ã§ã³ããã¼
å®éã« Itamae ãå®è¡ããéã«ã¯è¤æ°å°ã«ã¾ã¨ãã¦å®è¡ãããããCapistrano ã§ã¬ã·ãã転éããã㨠Itamae ãå®è¡ãã¦ãã¾ãã
ãã ããã®æ¹æ³ã ã¨
- å°æ°ãå¢ããæã«é ã
- å°æ°ãå¢ãã¦ããã¨ãªãã¬ã¼ã·ã§ã³ã®ã³ã¹ããããã
- æåã§å®è¡ãã¦ããã¨ãã¬ãã¸ããªä¸ã®ã³ã¼ãã¨ãµã¼ãã®ç¶æ
ãé£ãéã
- ã³ããããããããã¨ãã£ã¦ Itamae ãå®è¡ãããããã§ã¯ãªã
ã¨ãã£ãåé¡ããããç¾å¨èªåå®è¡ã®ä»çµã¿ãéçºä¸ã§ãã
GitHubã¸ã®ãã«ãªã¯ã¨ã¹ãã®ä½æãããã·ã¥ã奿©ã¨ãã¦ãdry-run ãå®éã®å®è¡ãè¡ãã¾ããä¸å³ã®éãã¯ãã¯ãããã§ã¯ Consul ãå©ç¨ãããã¨ãã¦ãã¾ãããItamae ã® SSH å®è¡ãªã©ä»ã®ããã¯ã¨ã³ããç¨æãããã¨èãã¦ãã¾ãã
ä»å¾ã®æ¹åæ§
ä»å¾ãä½ãå¦ç¿ã³ã¹ãã§ä½¿ãå§ãããã軽éã»ã·ã³ãã«ã«ä½¿ããã¨ããç¹å¾´ãç¶æãã¦ããã¾ãã ããã¨åæã«ã大ããªè¦æ¨¡ã«ãªã£ã¦ã使ããæ©è½ãåãã¦ããããã¨èãã¦ãã¾ãã
欲ããæ©è½ãããå ´åããã°ãè¦ã¤ããå ´åã¯ãé æ ®ãªã Issue ã Pull Request ã使ãã¦ããã ããã°ã¨æãã¾ãã
Itamae Meetup is coming soon
ã¤ãã«å®ç¨æ®µéã«å ¥ã£ããã¨è¨ã£ã¦ãéè¨ã§ã¯ãªã Itamae ã§ãããå©ç¨äºä¾ãå°ããã¤èãããã«ãªã£ã¦ããã®ã§ãã¼ãã¢ãããéå¬ããäºå®ã§ããæ¥æãªã©ã¯ã¾ã æªå®ã§ããããã²ãè¶ããã ããï¼çºè¡¨ãã¦ãã ããã