ถ้าใช้งาน Chef ต้องลองสร้าง Cookbook ใช้เองด้วยถึงจะครบกระบวนการ นอกจาก Cookbook ใน Opscode Community แล้วเราสามารถสร้าง Cookbook แบบที่เราต้องการเองได้ด้วย สำหรับท่านที่ถนันภาษา ruby ก็คงได้เปรียบสักหน่อย แต่สำหรับท่านที่ไม่ถนันก็ไม่เป็นไร เราสามารถสร้าง Cookbook แบบง่ายๆ ได้ โดยใช้เครื่องมือเดิมคือ Knife
แนวคิดของ Cookbook เหมือนกับการทำอาหารมีสูตรในการทำ (recipe) ดังนั้น Cookbook หนึ่งมีสูตรอาการได้หลายสูตรแล้วแต่ว่าจะปรุงอะไรออกมา ในการปรุงแต่ละสูตรจะมีกระบวนการปรุงซึ่งจะทำหนด อยู่ใน recipe นั่นเอง สำหรับ resource ทีี่ต้องใช้ recipe ได้แก่
- package: จัดการ package ใน node
- service: จัดการ service ใน node
- user: จัดการ user ใน node
- group: จัดการ group ใน node
- template: จัดการไฟล์ที่อยู่ในรูปแบบ ruby template
- cookbook_file: เก็บไฟล์สำหรับย้ายไปใช้กับ node โดยตรง
- file: จัดการไฟล์ ใน node
- directory: จัดการไดเรคทอรี ใน node
- execute: ใช้คำสั่ง ใน node
- cron: แก้ไข cron ใน node
มาลองสร้าง nginx cookbook สำหรับ Ubuntu ง่ายๆ กัน ใช้ Knife สร้าง Cookbook ดังนี้
cd ~/chef-repo
knife cookbook create nginx
จะได้โครงสร้างของ Cookbook ดังนี้
แก้ไขไฟล์ recipe ในไฟล์ ~/chef-repo/cookbooks/nginx/recipes/default.rb ดังนี้
package 'nginx' do action :install end service 'nginx' do action [ :enable, :start ] end cookbook_file "/usr/share/nginx/html/index.html" do source "index.html" mode "0644" end
สร้างไฟล์ index.html ลงใน ~/chef-repo/cookbooks/nginx/files/default/index.html เพื่อใช้เป็นหน้า index ของเว็บ ใส่โค้ดง่ายๆ ลงไปดังนี้
<html> <title>Hello World!</title> <body> <h1>Hello nGinX!</h1> </body> </html>
สร้าง Helper recipe สำหรับสั่ง apt-get update ก่อนติดตั้ง package enginx ดังนี้
knife cookbook create apt-update
แก้ไขไฟล์ recipe ที่ ~/chef-repo/cookbooks/apt-update/recipes/default.rb
execute "apt-get update" do command "apt-get update" end
แก้ไข ~/chef-repo/cookbooks/nginx/recipes/default.rb อีกรอบเพื่อเรียก recipe apt-update ก่อนติดตั้ง package nginx
include_recipe "apt-update" package 'nginx' do action :install end service 'nginx' do action [ :enable, :start ] end cookbook_file "/usr/share/nginx/html/index.html" do source "index.html" mode "0644" end
แก้ไข ~/chef-repo/cookbooks/nginx/metadata.rb เพิ่ม dependency cookbook ว่าต้องใช้ cookbook apt-update ร่วมด้วย
name 'nginx' maintainer 'YOUR_COMPANY_NAME' maintainer_email 'YOUR_EMAIL' license 'All rights reserved' description 'Installs/Configures nginx' long_description IO.read(File.join(File.dirname(__FILE__), 'README.md')) version '0.1.0' depends 'apt-update'
สั่ง upload cookbook ไปยัง Chef Server ได้เลย
knife cookbook upload --include-dependencies nginx
จากนั้นเพิ่ม role ใน policy แก้ไข role ใน node ที่ต้องการ
สั่ง knife ssh เพื่อ apply policy ได้เลย
knife ssh "role:nginx" "chef-client"
ลง browse ไปที่เครื่อง node ปลายทางดูจะได้แบบนี้