ถ้าใช้งาน 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 ปลายทางดูจะได้แบบนี้

Comments are closed.