天天看點

基于虛拟機的devops套件及把dbcolinux導出為虛拟機和docker格式

本文關鍵字:hashi packer,devops backend cloudcomputing,制作dbsubcolinux的docker模闆,零配置,自動化開發件

在前面我們多次談到cloud ide & liveeditor,用nas+docker作devops等內建思想,所謂devops,它是一個內建語言系統,開發件,運維件,IDE tools,容器環境的所有自動化開發相關的東西,Devops是一個很巨大的工程,它越來越作為IT的基礎存在,比如甚至這個過程和生态整合進了系統和運維 —— 這裡的需求是:統一開發,多節點分布式部署,持續釋出,大型網站的負載均衡架構,有點接近devops backend computing,—— 但更顯然,它最開始主要服務于開發devops backend appdev。

我在bcxszy選型中,與之對應的概念就是engitor (這個命名帶有點使cloud回歸native的概念),vs devops 我的思想要更超前一點,盡量零配置,自動化,使得使用者僅依賴它,就可以動手開發不管其它的東西。這個東西要像linux rootfs一樣可以配置出來,作為某種系統基礎件built into a os就好了,有點類似devops ci backend os的意思。。除了xaas的dbcolinux,在《選型》中devops的engitor它就是大頭了。

在現實生活中,devops雖然出現較晚,但對比物很多。這些都在我們以前與devops和cloud ide相關的文章中提到過,比如,gitlab是一個內建化的ci,cd平台。它是基于git的devops,這裡git隻是分布版本送出器與devops沒有太大關系,gitlab runner才開始有devops,我們以前也提到docker可用devops,單純的docker隻是一個容器還沒有持續的概念存在docker composer才剛有持續建構的概念存在。另外一個例子,就是mac osx的xcode ide,它是ide的devops可啟用build bot不過它也是對其它工具的調用,還有vagrant,Jenkins,chef這些。——— 是以,往往devops是對所有這些工具的結合運用,最終達到一種稱為CD,CI的過程,注意這個持續C —— 這其實本質就是一種代碼化加自動化思想,CI的思想本質就是就是把一切代碼化。就像腳本語言一切化一樣,碎片化了就可以做任何內建層的持續過程事情,比如docker有composer這是語義化了。實際上是可程式設計部署的容器(寫yal文法)和自動化部署(這就有了devops),vagrant這種用指令行vagrant up,etc..和可腳本配置方式控制虛拟機,是以也有devops可能。

我們還談到terralang是一種devops語言,其實所有腳本語言都可源碼文檔化,可內建式釋出和建構應用。比如實作terralang,使編譯期和運作期分離的那個macro系統,它就是一個指令行IDE。就是一種devops的運用。當然,還有很多,很多。。。。。。

基于虛拟機的devops:hashicorp tools

最近我用上了osx也使用了parallels desk,主要是沖着business和pro版有devops支援去的,它主要用的是vagrant,上面說到它使一切有了devops可能,vagrant有for parallels desk插件,不過它自己也有虛拟機部件,Vagrant就相當指令行代替了parallels desk的圖形環境,vagrant 甚至還可以與 docker 結合來用,parallels desk在osx上也就變成了一個基于虛拟機的full devops軟體。—— 這也是《聰明的osx雲》那文我們講到的它自帶devops,而實際上它的xcode ide也是.

說到這個vagrant,它是hashi corp的東西,它自己也有一個七件套,涵蓋虛拟機為中心展開devops的方方面面。以前我們主要談到docker,git為中心的devops,docker作為輕量虛拟機性能固然好,但是它不能管從0開始,核心定制方面的事情,而vagrant可以。我們這裡隻講建構,即與vagrant聯系緊密的一個叫packer的工具的使用,它可以制造供vagrant使用的鏡像。—— 這裡隻講建構,而且用virtualbox代替vagrant,因為packer支援廣泛 ——— 支援docker,支援各種虛拟機,甚至雲主機,而且vb又有一個圖形界面。

我們采用的例子是《将tinycolinux以硬碟模式安裝到主機》,在那文中,我們以前手工建構是先發明一個liveos,現在我們不需要了,因為借助packer我們可以直接在虛拟機上建構,試錯,調試。因為packer工具就一套以虛拟機為中心的devops文法支援的,持續建構器。

了解原理,準備基礎環境

我使用的是osx上的packer_1.4.1_darwin_amd64.zip,VirtualBox-6.0.8-130520-OSX.dmg,Packer的文檔在官網上都有,原理大約是先提供一個host os - 一個在其中建構的宿主,我們是在tinycolinux live os上定制新的tinycolinux hd,是以要先準備一個ISO,和各種它的tczs,生成的硬碟鏡像就是我們需要的。

在啟動建構過程中,packer會自動生成硬碟和虛拟機配置資訊(下述基礎腳本已寫明),然後就是準備builders,和執行provisioners腳本了。然後将這些寫入硬碟。

  • 安裝virtualbox
  • 下載下傳packer放入本地os的/usr/local/bin
  • 按下面基礎腳本要求準備microcore_3.8.4.iso和各種tczs材料。

準備基本腳本

{

  "_comment": “整個builders段,是定制這個iso出來的live os, 直到産生一個ssh登入服務,然後 provisioners接手。此時并未重新開機,除非你在腳本或inline中指定reboot”,
  "builders":
    [{
    "type": "virtualbox-iso",
    "_comment": “Linux_64這個virtualbox的預設模闆,裡面有預設的配置,當然你可以定制加入其它參數,具體翻packer文檔”,
    "guest_os_type": "Linux_64",
    "iso_url": "./microcore_3.8.4.iso",
    "iso_checksum": "41cbc86443cc12bfbf7b03c4965e4a171ac1aa993017aeef8d04c78db73c6afb",
    "iso_checksum_type": "sha256",
    "ssh_username": "tc",
    "ssh_password": "tc",
    "boot_wait": "4s",
    "shutdown_command": "sudo poweroff",
    "_comment": "http_directory會産生一個主機上的http伺服器,下面pkgs裡會有3.x,tcz這樣的檔案夾結構,tce-load -w才能正常下載下傳到”,
    "http_directory": "pkgs/",

    "boot_command":
        [    
          "<enter><wait10>",
          "ifconfig",
          "<return>",
        "sudo rm /opt/tcemirror && sudo touch /opt/tcemirror<return>",
        "_comment": “這個10.0.2.2是主機相對于虛拟機nat網卡能通路到的位址”,
        "sudo sh -c 'echo http://10.0.2.2:{{ .HTTPPort }}/ > /opt/tcemirror'",
        "<return>",
        "_comment": “每個tcz要從官網下好dep,md5.txt檔案”,
          "tce-load -iw openssh.tcz<return><wait10>",
          "sudo passwd tc<return>",
          "tc<return>",
          "tc<return>",
        "sudo cp /usr/local/etc/ssh/sshd_config.example /usr/local/etc/ssh/sshd_config<return><wait>",
          "sudo /usr/local/etc/init.d/openssh start<return><wait>"
          ],

      "export_opts": 
          [
          "--manifest",
          "--vsys", "0",
          "--description","{{user `vm_description`}}",
          "--version", "{{user `vm_version`}}"
          ],
      "format":"ova",
      "vm_name":"dbcolinux"
    }],


  "_comment": “整個provisioners段,開始為這個guestos作各種寫入硬碟(那個linux_64自動生成的一塊40g的硬碟)作上述export前的過程,當然,如何寫入,腳本裡要寫明”,
  "provisioners": 
    [{
        "type": "shell",
        "pause_before":"1s",
        "execute_command": "echo '' | sudo -S sh -c '{{ .Vars }} {{ .Path }}'",
        "inline":
        [
        "cp -R /tmp/tce ~/"
        ]
    },

    {
        "type": "shell",
        "pause_before":"1s",
        "inline":
        [
        "tce-load -iw parted.tcz",
        "tce-load -iw grub2.tcz"
        ]
    },

    {
        "type": "shell",
        "pause_before":"1s",
        "execute_command": "echo '' | sudo -S sh -c '{{ .Vars }} {{ .Path }}'",
        "scripts":
        [
        "./scripts/phase1.sh"
        ]
        }]

}           

假設上面建構檔案儲存為dbcolinux-pe.packer,調試和啟動建構的方法:

進入正确的目錄,執行packer build ./dbcolinux-pe.packer(for test and debug, you can use -debug -on-error=ask after build command),用了ask,它會問,你調試完後選擇clean即可。不要立即作答。如果用了-debug會走一步卡一步讓你确認。

Scripts中就是如何寫入硬碟,寫入哪些東西形成硬碟系統的邏輯,這是一個字元數組,目前隻有phase1一個檔案

scripts->phase1中的内容

export PATH=$PATH:/usr/local/sbin:/usr/local/bin

echo PREPARE HD
parted /dev/hda mktable msdos
parted /dev/hda mkpart primary ext3 1% 99%
parted /dev/hda set 1 boot on
mkfs.ext3 /dev/hda1
parted /dev/hda print
rebuildfstab
mount /mnt/hda1

echo COPY SOFT
echo /usr/local/etc/init.d/openssh start >> /opt/bootlocal.sh
echo usr/local/etc/ssh > /opt/.filetool.lst
echo etc/passwd>> /opt/.filetool.lst
echo etc/shadow>> /opt/.filetool.lst
/bin/tar -C / -T /opt/.filetool.lst -cvzf /mnt/hda1/mydata.tgz
mv ~/tce /mnt/hda1/
cp -R /opt /mnt/hda1

echo INSTALLING GRUB
grub-install --boot-directory=/mnt/hda1/boot /dev/hda
mkdir /mnt/cdrom/
mount /dev/cdrom /mnt/cdrom
cp /mnt/cdrom/boot/microcore.gz /mnt/hda1/boot/microcore.gz
cp /mnt/cdrom/boot/bzImage /mnt/hda1/boot/bzImage
echo set timeout=3 > /mnt/hda1/boot/grub/grub.cfg
echo menuentry \\\"dbcolinux\\\" { >> /mnt/hda1/boot/grub/grub.cfg
echo  linux /boot/bzImage com1=9600,8n1 loglevel=3 user=tc console=ttyS0 console=tty0 noembed nomodeset tce=hda1 opt=hda1 home=hda1 restore=hda1 >> /mnt/hda1/boot/grub/grub.cfg
echo  initrd /boot/microcore.gz >> /mnt/hda1/boot/grub/grub.cfg
echo } >> /mnt/hda1/boot/grub/grub.cfg

#reboot           

——————

懂得了原理,基本夠用的語句,或許以後,我們會把所有的xaas->dbcolinux上寫過的文章中的建構全部按lesson執行個體寫一次。

關注我

(此處不設回複,掃碼到微信參與留言,或直接點選到原文)

基于虛拟機的devops套件及把dbcolinux導出為虛拟機和docker格式