นโยบายการจัดการความรู้ มหาวิทยาลัยสงขลานครินทร์ 1.ให้ใช้เครื่องมือการจัดการความรู้ผลักดัน คุณภาพคน และกระบวนทำงาน 2.ส่งเสริมการแลกเปลี่ยนประสบการณ์การทำงาน จากหน้างาน 3.ส่งเสริมให้มีเวทีเรียนรู้ร่วมกัน

นาย ฉัตรชัย จันทร์พริ้ม
Ico64
เครือข่าย
สมาชิก · ติดตาม: 4 · ผู้ติดตาม: 5

อ่าน: 1990
ความเห็น: 0

สคริปต์ สำหรับการ ตรวจสอบ package ที่ต้องการ update ของ Debian Server

What need to be updated on the debian server...

Shell Script อันนี้ เขียนขึ้นมาเมื่อปี 2003 และยังใช้งานอยู่จนถึงปัจจุบัน บนเครื่องคอมพิวเตอร์ ที่ทำหน้าที่เป็นเซอร์ฟเวอร์ของภาควิชาฯทั้งหมด  ซึ่งมีทั้งที่เป็น Debian (ซึ่งใช้ apt-get/dpkg เป็นตัวจัดการ package) และ Centos (ซึ่งใช้ yum/rpm เป็นตัวจัดการ package แต่ก็สามารถหา apt-get package ที่เป็น RPM มาติดตั้งเพิ่ม และทำให้ใช้คำสั่ง apt-get จัดการ package ต่อไปได้)

สำหรับเครื่องคอมพิวเตอร์ที่เป็น desktop ซึ่งใช้งาน GUI -- (จะมีใครที่ใช้งาน desktop แต่ไม่ใช้ GUI เหลืออยู่บ้างใหมนี่?) -- อย่างเช่น Gnome, KDE, XFCE บน Debian (หรือ ubuntu) โดยทั่วไปก็จะมี package ที่ชื่อว่า update-notifier ติดตั้งมาให้ด้วย ซึ่งเจ้า daemon ตัวนี้ก็จะคอยตรวจสอบให้ว่า บนเครื่องที่เราใช้งานอยู่ มี package ใดบ้างที่ต้องการการ upgrade จะเนื่องด้วย security หรือ มี package ใหม่ที่แก้บักแล้วก็ตามที (ซึ่งใน /etc/apt/sources.list หรือ /etc/apt/sources.list.d ก็จะต้อง config source ของ package ให้ถูกต้องและใช้งานได้ก่อน)

สำหรับเครื่องที่ใช้ stable dist ของ debian ก็อาจจะเห็นผลของเจ้า update-notifier ไม่ค่อยบ่อยนัก แต่ถ้าเป็น testing ซึ่ง ณ. วันที่เขียนบทความอยู่นี้ คือ lenny ก็จะเห็น package ที่ต้อง update ทุกวันเลย

จำเป็นหรือเปล่าที่ต้อง update package ทุกวัน? -- ก็คงไม่ ถ้าหากว่า package นั้นๆ ที่ใช้งานอยู่มันยังทำงานได้ดี และถึงจะมี bug แต่ถ้า bug มันยังไม่โผล่มากวนใจเวลาทำงาน ถึงจะไม่ update ก็คงไม่เสียหายอะไร -- สำหรับ desktop หรือ เครื่อง ส่วนบุคคล

ยกเว้น การ update นั้นเกี่ยวข้องกับ security และ ยิ่งไปกว่านั้น โดยเฉพาะ ถ้าเครื่องนั้นเป็น Server ซึ่งต้องให้บริการอยู่ตลอดเวลา และ สามารถติดต่อจากภายนอกเข้ามาได้ด้วย ถ้ามี package ที่ต้องการ update เมื่อไหร่ ก็ควรจะ update โดยเร็วที่สุด

วิธีการที่ผมใช้อยู่บนเครื่องส่วนตัว ก็จะใช้คำสั่งจาก command line บน terminal

 $ sudo apt-get -y update && sudo apt-get -y dist-upgrade && sudo apt-get clean

 คำสั่งแรก apt-get -y update (เรียกผ่าน sudo เพราะการจัดการกับ package บนเครื่องต้องการสิทธิของ root) ใช้สำหรับ update package list ก่อน

คำสั่งที่สอง sudo apt-get -y dist-upgrade จะเป็นการ ติดตั้ง package ที่ต้องการ upgrade ลงไปในเครื่อง สำหรับ คำสั่งนี้ อาจจะใช้ apt-get -y upgrade ก็ได้ ซึ่งจะเป็นการ upgrade แบบ หนึ่ง-ต่อ-หนึ่ง นั่นคือถ้ามี package เวอร์ชันใหม่กว่าที่ต้องติดตั้งแทน package เดิม ที่มีอยู่แล้ว ก็จะสามารถติดตั้งลงไปได้เลย แต่สำหรับกรณีที่ package เวอร์ชั่นใหม่กว่านั้น ตอนที่จะติดตั้ง จะต้องมีการติดตั้ง package อื่น เพิ่มเติม ซึ่งอาจจะเนื่องจากมีการแยก package เดิมเป็นหลาย package ย่อย หรือ เวอร์ชันใหม่มี feature อะไรบางอย่างเพิ่มขึ้น ทำให้ต้องใช้ library หรือ function อะไรบางอย่างเพิ่มขึ้น ซึ่งอยู่ใน pakcage อื่นๆทำให้การ update package นี้เป็นแบบ หนึ่ง-ต่อ-หลาย (one-to-many) การใช้คำสั่ง apt-get -y upgrade จะไม่ติดตั้งให้อัตโนมัติ แต่ apt-get -y dist-upgrade จะช่วยจัดการตรงส่วนนี้ให้

ส่วน sudo apt-get clean ก็จะเป็นการ clean up package ที่ download มาและติดตั้งเสร็จแล้วออกไปจาก cache ของระบบ ซึ่งจะช่วย

สำหรับ lenny และ dist ใหม่ อาจจะเพิ่มคำสั่ง sudo apt-get -y autoremove เข้าไป ซึ่งคำสั่งนี้จะใช้สำหรับการ remove package ที่ไม่ต้องการใช้อีกแล้วออกจากระบบ

ซึ่งถ้าดูไปแล้ว วิธีการนี้ ถ้าใช้งานได้บน desktop ก็น่าจะใช้งานได้จาก server เช่นเดียวกัน ใช่ใหมครับ ก็ใช้ secure shell สำหรับ remote login เข้าไปที่ server เครื่องนั้นๆ แล้วก็ run คำสั่งเหล่านี้ซะ

หรือถ้าจะให้ง่ายกว่านั้น เขียนเป็น script แบบ

#!/bin/sh
sudo apt-get -y update
sudo apt-get -y dist-upgrade
sudo apt-get -y clean
sudo apt-get -y autoremove 


แล้วใส่ไว้ใน crontab ซะ ก็น่าจะได้ ไม่น่าจะจำเป็นที่ต้องมีอะไรให้ยุ่งยาก ไปกว่านั้นเลย

ครับ ในสมัยแรกๆ ผมก็ใช้วิธีการ ประมาณว่า remote login เข้าไป run คำสั่งเองในแต่ละเครื่อง แต่พอจำนวนของ server เริ่มมากขึ้น ก็ชักจะจำไม่ได้แล้วว่า มีเครื่องใหนบ้างแล้ว ที่ update ไปแล้ว เครื่องใหนบ้างที่ยังไม่ได้ update

ดังนั้นในช่วงแรกก็ script สั้นๆ ตามตัวอย่างข้างบน และใส่ไว้ใน crontab ให้ทำงานวันละครั้ง แต่ก็มีปัญหาใหญ่ตามมา

ในการ update package บางกรณี -- เกิดขึ้นไม่บ่อยนัก -- แต่ถ้าเกิด ก็อาจจะเป้นปัญหาใหญ่ -- ไม่สามารถ update แบบอัตโนมัติได้ ยังต้องการการตัดสินใจของผู้ดูแล ว่าจะทำอย่างไรต่อไป กับ ... ตัวอย่าง config file ที่เปลี่ยนไป หรือ กีกระบวนการบางอย่าง ซึ่งซอฟต์แวร์ไม่สามารถตัดสินใจโดยข้อมูลที่มีอยู่ได้

การสั่ง run อัตโนมัติ โดยใช้ crontab อาจจะทำให้ package นั้นๆ upgrade/ติดตั้งไม่สมบูรณ์ และไม่สามารถทำงานต่อไปได้ ซึ่งต้องรอให้ผู้ดูแลมาจัดการ

สำหรับกรณีนี้การไม่ update/upgrade โดยอัตโนมัติ อาจจะเป็นทางเลือกที่ดีกว่า 

ผลสรุปที่ได้ และ จากทางเลือกที่มี หลังจาก ลองผิด มาแล้ว 2-3 ครั้ง ก็ได้ วิธีการที่ใช้งานมาแล้วเกือบ 5 ปีและยังใช้งานได้ดีอยู่ ก็คือ ใช้วิธีการตรวจสอบ package ที่ต้องการ upgrade แบบอัตโนมัติ ส่วน การ upgrade จริงใช้วิธีการแบบ กึ่งอัตโนมัติ

script ข้างล่างนี้ run จาก crontab โดยจะ update package list และ download package ที่ต้องการติดตั้ง มาเก็บไว้ที่ server ก่อน (apt-get -d upgrade จะ download package อย่างเดียว โดยที่ยังไม่ติดตั้งลงไป) และจะเอา log file ที่ได้ส่งเป็น e-mail ไปให้ผู้ดูแลทราบ โดยจะสรุปจำนวน package ที่ต้องการ update ไว้ใน Subject ของ e-mail 

ซึ่ง e-mail ที่ผมได้รับในแต่ละวัน ก็จะมี subject ประมาณนี้

  18 O   Dec 27 netop-cj@ninedo (  42) 20081227 ninedots (0,0,0,0) pkgupdate
  19 O   Dec 27 Chatchai J as N (  42) 20081227 nineteen (0,0,0,0) pkgupdate
  20 O   Dec 27 Chatchai J as N (  37) 20081227 pabxdata (0,0,0,0) pkgupdate
  21 O   Dec 27 Chatchai J as N (  42) 20081227 psu-grid (0,0,0,0) pkgupdate
  22 O   Dec 27 Chatchai J as N (  45) 20081227 psu-soi (0,0,0,0) pkgupdate
  23 O   Dec 27 netop-cj@t-serv (  30) 20081227 t-server (0,0,0,0) pkgupdate
  24 O   Dec 27 Chatchai J as N (  42) 20081227 takasila (0,0,0,0) pkgupdate
  25 O   Dec 27 Chatchai J as N (  42) 20081227 tftp (0,0,0,0) pkgupdate
  26 O   Dec 27 Chatchai J      (  45) 20081227 th.cjv6.net (2,0,0,0) pkgupdate
  27 O   Dec 27 Chatchai J      (  30) 20081227 uk.cjv6.net (0,0,0,0) pkgupdate
  28 O   Dec 27 Chatchai J      (  41) 20081227 us (2,0,0,0) pkgupdate
  29 O   Dec 27 Chatchai J as n (  30) 20081227 v-server (0,0,0,0) pkgupdate   

 ซึ่งดูจาก Subject ก็พอที่จะรู้เลยว่าต้อง upgrade server เครื่องใหนบ้าง เช่น  20081227 nineteen (0,0,0,0) แสดงว่า ผลของการ run script บนเครื่อง nineteen เมื่อวันที่ 27 ธค. 2551 ไม่มี package ที่ต้องการ update เลย และ 20081227 th.cjv6.net (2,0,0,0) ผลการ run script บนเครื่อง th.cjv6.net จะมี package ที่ต้องการ update อยู่ 2 package ไม่มี package ที่ต้อง remove หรือ ติดตั้งเพิ่มเติม

ส่วนวิธีการ ตรวจสอบ และ upgrade แบบ "กึงอัตโนมัติ" นั้น ซับซ้อนเพิ่มขึ้นอีกหน่อยเดี๋ยวค่อยมาเขียนต่อครับ ...

#!/bin/sh

# *********************************************************************    #
# pkgupdate    : script for calling from crontab to update debian    #
#          packages on a machine using apt-get            #
#          Mainly this is a two commands                #
#                                    #
#          apt-get update && apt-get upgrade -y -d upgrade    #
#                                    #
#          but made readable report from the output of those    #
#          two commands                        #
#                                    #
# *********************************************************************    #
HOST=`hostname`
DATE=`date +%Y%m%d`
DATE2=`date`
LOG=`mktemp /tmp/.pkgupdate.XXXXXX`
ADMIN="root"    # To whom it should send mail to

# sudo apt-key update > $LOG
sudo apt-get update >> $LOG
sudo apt-get -y -d upgrade >> $LOG

line=`cat $LOG|grep upgraded|grep installed|grep remove|sed -e 's/packages//'`

upgrade=`echo $line | cut -f1 -d' '`
install=`echo $line | cut -f3 -d' '`
remove=`echo $line | cut -f6 -d' '`
keptback=`echo $line | cut -f10 -d' '`
RESULT="$upgrade,$keptback,$remove,$install"

SUBJ="$DATE $HOST ($RESULT) pkgupdate"

( cat <<EOT
Debian packages update for '$HOST' on "$DATE2"
====================================================================
Summary:
    Upgrade:  $upgrade
    KeptBack: $keptback
    Remove:   $remove
    Install:  $install
====================================================================
Detail:
EOT
cat $LOG
) | mail -s "$SUBJ" $ADMIN

rm -f $LOG

# *********************************************************************    #
# end of script                                #
# *********************************************************************    #

หมวดหมู่บันทึก: เรื่องทั่วไป
คำสำคัญ (keywords): debian  linux  update package  security
สัญญาอนุญาต: สงวนสิทธิ์ทุกประการ Copyright
สร้าง: 29 ธันวาคม 2551 09:18 แก้ไข: 21 มิถุนายน 2552 14:39 [ แจ้งไม่เหมาะสม ]
ดอกไม้
สมาชิกที่ให้กำลังใจ
 
Facebook
Twitter
Google

บันทึกอื่นๆ

ความเห็น

ไม่มีความเห็น

ร่วมแสดงความเห็นในหน้านี้

ชื่อ:
อีเมล:
IP แอดเดรส: 23.21.4.239
ข้อความ:  
เรียกเครื่องมือจัดการข้อความ
   
ยกเลิก หรือ