มาเล่น Chef กัน

Chef เป็นเครื่องมือด้าน System Configuration อีกตัวนึง เหมาะสำหรับการ config เครื่องเซิร์ฟเวอร์ที่มีจำนวนมากๆ แบบไม่ต้อง ssh เข้าไปทีละเครื่อง แนวคิดของ Chef ก็เหมือนกับชื่อล่ะครับ กุ๊กอยากจะทำอาหารอะไร ก็ต้องมีตำราอาหาร (Cookbook) วิธีการทำ (Recipe) และ ขั้นตอนการทำ (Run list) ก่อนที่มาเล่น Chef ลองมาดูส่วนประกอบต่างๆ ที่จะต้องมีกันก่อน

  1. Workstation คือ เครื่องที่ System Admin ใช้ทำงาน เขียนตำราอาหาร เขียนสูตรอาหาร
  2. Chef Server คือ เครื่องที่ใช้เก็บตำราอาหาร สูตรอาหารต่างๆ
  3. Node คือ เครื่องที่เราต้องการ config โดยดึงข้อมูลจาก Chef Server มาประมวลผล

จะใช้งาน Chef ต้องมี Chef Server ครับ สำหรับท่านที่ต้องการใช้ Chef Server ที่ทาง OpsCode เป็นคนดูแลก็สามารถใช้งานได้ (ผมแนะนำ) แต่ถ้าต้องการตั้ง Chef Server เองก็สามารถทำได้ครับ ก่อนอื่นมาติดตั้ง Chef Server กันก่อน ผมมีเครื่อง Ubuntu Server 64ิBits ต้องเป็น 64Bits เท่านั้นนะครับ
ดาวน์โหลด Chef Server และติดตั้งด้วยคำสั่ง
sudo dpkg -i chef-server_11.0.12-1.ubuntu.12.04_amd64.deb
sudo chef-server-ctl reconfigure
เมื่อติดตั้งเสร็จให้เปิด browser ไปที่ https://chef-server ใส่ username = admin และ password = p@ssw0rd1 จะได้หน้าตาแบบนี้

ได้ Chef Server แล้ว กลับมาที่เครื่อง Admin Workstation หรือเครื่องที่เราใช้งานกันนี่แหละครับ ดาวน์โหลด Chef Client มาติดตั้งที่เครื่องเรากันก่อนดังนี้
curl -L https://www.opscode.com/chef/install.sh | sudo bash
รอให้ติดตั้งจนเสร็จ จากนั้นมาเขียนไฟล์ config กัน ถ้าคุณใช้ Hosted Chef Server ดึงออกมาจาก Kick Start ได้เลยครับ แต่เรายากจนติดตั้ง Chef Server เองก็ต้องมาเขียน config กันเอาเอง ดังนี้
mkdir ~/.chef
เขียน config ชื่อ knife.rb ใส่ข้อมูลลงไปดังนี้
node_name 'admin'
chef_server_url 'https://chef-server.ffeee.org'
validation_client_name 'chef-validator'
validation_key '/etc/chef/chef-validator.pem'
cookbook_path ["~/.chef/cookbooks"]
สร้างไฟล์ /etc/chef/client.pem เอา Private Key ของ Admin มาใส่


และไฟล์ /etc/chef/chef-validator.pem เอาค่า chef-validator มาใส่


สร้างไดเรคทอรี cookbook ใน ~/.chef/cookbooks ดังนี้
mkdir -p ~/.chef/cookbooks
จากนั้น init git repository ที่ไดเรคทอรี cookbooks ดังนี้
cd ~/.chef/cookbooks
touch readme.md
git init
git add .
git commit -m 'init repo'
ลองใช้คำสั่ง knife ดูครับ
knife client list
ค่าที่ได้จะแสดง chef-validator และ chef-webui ออกมา และไม่ error ถือว่าเป็นอันใช้ได้ 🙂
เมื่อได้ Workstation, Chef Server แล้วก็ถึง Node ต่างๆ Chef มีเครื่องมือลัดให้เราติดตั้ง Chef Client โดยที่เราไม่ต้อง ssh ไปทีละ node ทำให้ไม่เหนื่อยมากนัก โดยใช้คำสั่งดังนี้
knife bootstrap node01.example.com --sudo -x username -P password -N "chef-node01"
จากนั้น knife จะติดตั้ง Chef Client ที่เครื่อง Node ให้ สั่งแบบนี้จนครบทุกเครื่องครับ 😛 ถ้าไม่อยากเหนื่อยก็เขียน shell script เอาก็ได้ 🙂 เมื่อติดตั้งเสร็จแล้วเราจะพบว่ามีรายละเอียดของ Node ใน Chef Server แล้ว

เมื่อได้ Node ครบแล้ว กลับมาที่ Workstation เราครับ เราจะดึง Cookbook จาก Chef Community Cookbook มาใช้กัน ตัวอย่างเป็น Apache2 🙂 ใช้คำสั่งดังนี้
knife cookbook site install apache2
Knife จะดาวน์โหลด Cookbook ของ Apache2 และ dependency cookbook มาให้เราด้วย 🙂 ถ้าอยากจะแก้ไข หรือ recipe ก็สามารถแก้ไขได้เลย จากนั้นอัพโหลด Cookbook ไปไว้ที่ Chef Server โดยใช้คำสั่ง
knife cookbook upload apache2 iptables logrotate pacman
ลองเข้าไปดูใน Chef Server เราจะเห็นว่ามี Cookbook อัพโหลดเข้ามาแล้ว

จากนั้นมากำหนด run list ให้ node01 ที่เราจะติดตั้ง Apache2 กันดังภาพ

เมื่อกำหนด run list แล้วสั่ง chef-client ที่เครื่อง node ได้เลย หรือจะสั่งผ่าน knife ได้เช่นกัน ตัวอย่างเช่น ให้ node ที่มีชื่อ * (คือทุก node) ใช้คำสั่ง chef-client ดังตัวอย่าง
knife ssh 'name:*' 'chef-client' --sudo -x username -P password
เมื่อสั่ง chef-client เครื่อง node จะเรียกดูข้อมูลจาก Chef Server ว่าเครื่องนี้้ต้องใช้ Cookbook อะไรบ้าง จากนั้นก็ทำตามลำดับที่กำหนดไว้ใน run list ลองเปิด browser เข้าไปดูที่เครื่อง node01 ก็จะพบว่า ได้ติดตั้ง Apache2 เรียบร้อยแล้ว 😉

มาเล่น Puppet Enterprise กัน

เนื่องจากมีโอกาสได้กลับมาเล่น Puppet อีกรอบก็เลย blog ไว้สักหน่อย เป็นที่ระลึก เพราะครั้งนี้เล่น Puppet Enterprise เลยทีเดียว Puppet เป็นเครื่องมือใช้ทำ System Configuration Management ช่วย ติดตั้ง และ config package ลงในเครื่องเซิร์ฟเวอร์หลายๆ เครื่องได้อย่างรวดเร็ว โดยไม่ต้องไล่ ssh ไปทีละเครื่องเพิ่อติดตั้ง package นั้นๆ เอง Puppet สนับสนุนการใช้ใช้งานร่วมกับ Cloud Infra และ Bare Metal อีกด้วย (Razor) ก่อนเล่น Puppet ต้องเข้าใจเรื่องโครงสร้าง Puppet กันคร่่าวๆ สักหน่อย
puppet enterprise diagrame
Puppet ทำงานแบบ master – node คุยกันผ่าน mcollective ซึ่งจะต้องมี Puppet master และ node ที่ติดตั้ง agent เอาไว้ Puppet master จะทำหน้าที่ orchestration node ที่ผูกผ่าน agent ทำให้ Puppet master สามารถที่จะ config ติดตั้ง package ที่เราต้องการไปยัง node ผ่าน Puppet master ได้ อธิบายคร่าวๆ อย่างนี้ก็แล้วกันครับ อ้อ เกือบลืมไป Puppet Enterprise สามารถใช้งานได้ฟรี ผูก node ได้ 10 เครื่อง อยากผูก node เพิ่มต้องจ่ายตังค์เพิ่มครับ มาลงมือกันดีกว่า
เนื่องจากผมมีเครื่อง Ubuntu ก็ขอใช้ Ubuntu server 12.04.4 LTS ละกัน ติดตั้ง Ubuntu server, OpenSSH server และตั้ง NTP กับ time server ให้เรียบร้อย ทั้ง 2 เครื่อง คือ master, node1 ตามรูป เครื่อง master และเครื่อง node มองเห็นกันทดสอบ ping ผ่าน hostname ดูครับ
pupetlabs
เข้าไปที่เว็บไซต์ http://puppetlabs.com จากนั้น download Puppet Enterprise แบบ Full Install ให้ตรงกับ OS และ Architecture ที่คุณใช้ ซึ่งก็คือ Ubuntu 12.04 ของผมใช้ 32bits
puppet download
คุณจะได้ไฟล์ puppet-enterprise-3.2.0-ubuntu-12.04-i386.tar.gz มา ถ้าใช้ amd64 คุณจะได้ไฟล์ puppet-enterprise-3.2.0-ubuntu-12.04-amd64.tar.gz มาครับ อย่าดาวน์โหลดผิดเวอร์ชันเป็นพอ จากนั้นก็แตกไฟล์นี้ที่เครื่อง master และ เครื่อง node ให้เรียบร้อย
เครื่อง master สั่งติดตั้ง Puppet master
cd puppet-enterprise-3.2.0-ubuntu-12.04-i386
./puppet-enterprise-installer
ตัวติดตั้งจากถามคือถามเราเรื่อยๆ ก็ตอบ yes/no ไปเรื่อยๆ ดังนี้
ติดตั้ง Puppet master มั๊ย ตอบ y
Install puppet master? [y/N] y
ติดตั้ง PuppetDB มั๊ย ตอบ y
Install PuppetDB and console on this node? [Y/n] y
จะ provision vm บน cloud มั๊ย ตอบ n เพราะไม่ได้ใช้อ่ะ
Install the cloud provisioner? [y/N]
ตั้งชื่อ certificate อะไร ใช้ default
Puppet master’s certname? [Default: master]
ตั้ง DNS aliase ใช้ default
Puppet master’s DNS aliases (comma-separated list)? [Default: master,puppet]
ติดตั้ง PostgreSQL ไว้ที่เครื่อง master มั๊ย ตอบ y เพราะยังไม่มี PostgreSQL
Install the included Puppet Enterprise PostgreSQL server locally? [Y/n]
หลังจากนั้นก็ config console กำหนด admin account ใส่ email ที่จะใช้ login ลงไป
Admin email address (will be used as account name) for accessing the console interface? puppet@example.com
ใส่ password ที่เราต้องการ
Password for user puppet@example.com (minimum 8 characters)?
จากนั้นตัวติดตั้งจะแจ้งว่า package ที่ต้องใช้ติดตั้งเพิ่มเติมมีอะไรบ้าง และถามว่าเราว่าจะให้ติดตั้งให้ป่าว ตอบ y เพราะไม่มีก็ใช้ไม่ได้นี่
Install these packages automatically? [Y/n] y
จากนั้นตัวติดตั้งจะสรุปว่าจพติดตั้งอะไรบ้าง ตั้งแต่กด yes/no มายาวๆ แล้วถามว่าจะติดตั้งเลยมั๊ย ตอบ y
Perform installation? [Y/n] y
จากนั้นตัวติดตั้งก็จะทำการ ติดตั้ง package ที่ต้องใช้งาน และ config ค่าต่างๆ ให้อัตโนมัติ นั่งรอจนกระทั่งถึง STEP 4 ซึ่งจะแจ้งผลการติดตั้ง ที่อยู่ของ answer file เก็บ answer ไฟล์ไว้ดีๆ เพราะในไฟล์นี้จะมีข้อมูล config ต่างๆ และรวมถึงรหัสผ่านการเข้าใช้งาน PuppetDB และ PosgreSQL ด้วย ซึ่งอาจจะต้องใช้อีกในอนาคต 🙂 เมื่อติดตั้งเรียบร้อยแล้วก็เปิด browser ขึ้นมาแล้ว browser ไปที่เครื่อง master ของคุณ ด้วย url https://master หรือตามด้วย ip ก็ได้ เช่น https://192.168.2.160 คุณก็จะได้หน้าล็อกอินแบบนี้
console login
ลอง login ดูว่าเข้าได้หรือเปล่า 🙂
after login
กลับมาที่เครื่อง node ติดตั้ง Puppet agent ดังนี้
cd puppet-enterprise-3.2.0-ubuntu-12.04-i386
./puppet-enterprise-installer
จากนั้นก็ตอบคำถาม yes/no กันอีกรอบ ดังนี้
Install puppet master? [y/N]
Install PuppetDB? [y/N]
Install the console? [y/N]
Install the cloud provisioner? [y/N]
Install puppet agent? [Y/n]
Install these packages automatically? [Y/n]
Perform installation? [Y/n]
นั่งรอจนกระทั่งถึง STEP 4 ซึ่งจะแจ้งผลการติดตั้ง ที่อยู่ของ answer file เก็บ answer ไฟล์ไว้ดีๆ เพราะเราอาจจะเอาไปใช้กับเครื่อง node เครื่องต่อไป หลังจาก config node เสร็จกลับไปดูที่หน้า web console จะพบว่ามี node request เข้ามาดังนี้
node request
กดเข้าไปแล้ว Acept Node ดังนี้
acept node request
รอ Agent ส่งข้อมูล factor เข้ามาที่ master ลอง refest หน้า web console ก็จะได้ node เข้ามา 1 ตัวแล้ว
add node
ที่เครื่อง node ทดสอบ Agent กันด้วยคำสั่ง
puppet agent --test
ให้ตรวจสอบว่า node ที่เพิ่มเข้ามาอยู่ในกลุ่ม mcollective หรือยัง
mcollective group
ทีนี้มาลองเล่น Live Management กัน เข้าไปที่ Live Management จากนั้นเลือก master, node ที่มีอยู่ แล้วลอง search package ดูว่าในเครื่อง master, node มี package ntp ติดตั้งหรือเปล่า เราก็จะได้ผลลัพท์ว่าเครื่อง master, node มี ntp ติดตั้งอยู่
find ntp package
มาเล่นในส่วน configuration management กันบ้าง เนื่องจาก Puppet Enterprise ที่ติดตั้งจะมี class พื้นฐาน ของ Puppet ที่ต้องใช้ แต่ไม่มีที่เราต้องใช้ T_T ดังนั้นเราต้องเขียน Puppet module กันเอาเอง หรือใช้บริการ Puppet module จาก Puppet Forge ก็ได้
puppet forge
วิธีการเล่นกับ Puppet Enterprise มีขั้นตอนง่ายๆ ดังนี้

  1. เขียน module หรือติดตั้งจาก Puppet Forge
  2. เพิ่ม Class เข้าไปในระบบ (ถ้าใช้ command line ก็เหมือนที่เราเขียน class ที่เป็น pp ไฟล์นั่นเอง)
  3. กำหนด node ให้อยู่ใน Class นั้นๆ หรือกำหนด node ให้อยู่ใน Group นั้นๆ

มาลองกันครับ
puppet module install puppetlabs-apache
puppet module install
ลองเช็คสักหน่อยว่าไม่มีอะไรพัง
puppet module list
puppet module list
ที่นี้กลับเข้ามาที่ web console เพิ่ม Class กัน กดปุ่ม Add Class แล้วค้นหา module Apache ดูครับ เราจะพบว่ามี Class ย่อยๆ อีกเยอะ สามารถเลือกได้ตามใจชอบ เช่น apapche, apache:php เป็นต้น จากนั้นกดปุ่ม Add Class เราก็จะได้ Class มาเพิ่มอย่างนี้
Class list apache
เพื่อความเป็นระเบียบเพิ่ม Group ขึ้นมาครับ กดปุ่ม Add Group สร้างกลุ่ม www ขึ้นมา เพิ่ม Class apache และ เพิ่ม node ของเราเข้าไป กดปุ่ม Create เท่านี้ก็เรียบร้อยแล้ว
add group
เข้าไปดูรายละเอียด node เราอยู่ใน Group www เรียบร้อยแล้ว
node1 detail
หลังจากนี้นั่งรอครับ mcollective จะเข้าไปคุยกับ node แล้ว deploy apache ให้ ถ้าใจร้อนก็เข้ามาที่ Live Management เลือก node เลือก Control Puppet เลือก runonce… กดปุ่ม run ได้เช่นกัน กลับไปดูหน้ารายละเอียด node จะพบว่ามี change แล้ว ดู report ว่าไม่มีอะไรพัง เป็นอันใช้ได้ครับ 🙂
change report
change event
อาจจะลองเข้าไปดู package list ว่า apache2 ติดตั้งหรือยังก็ได้
package list
ลอง browse ไปที่ node1 ดู ก็จะพบว่า apache ติดตั้งเรียบร้อยแล้ว
browse node1
หากคุณอยากได้เครื่อง webserver อีก ก็แค่เพิ่ม node ใหม่อยู่ในกลุ่ม www เท่านี้ node ที่เพิ่มเข้ามาก็จะติดตั้ง apache ให้เสร็จเรียบร้อยโดยไม่ต้อง ssh ไปติดตั้ง apapche เลย สำหรับการใช้งาน Puppet เราสามารถสร้าง module เพื่อ deploy application ที่เราต้องการได้ เช่น ติดตั้ง apache + php + mysql + wordpress เป็นต้น หากไม่อยากเขียนเอง ก็ download module จาก Puppet Forge มาใช้งานกันได้ 🙂