您好,登錄后才能下訂單哦!
簡單介紹一下自己
Packer 是一個輕量命令行工具, 能在幾乎所有主流的操作系統上運行。
在給定一份配置文件的情況下, Packer 能為多種系統架構創建云主機鏡像。同時 Packer 自身也能夠做到多鏡像并發創建, 大大節省了鏡像創建過程中的時間成本。
為什么要用 Packer
為什么呢?
當然是因為使用預制的鏡像有非常多的好處, 最簡單來說,就是能最大程度地保證不同機器上服務的一致性(以經驗來看這一點非常重要)。但是在實際使用中, 鏡像因其創建/管理的工作單調且復雜, 很多情況下鏡像還沒有被完全普及。
現有的鏡像自動化創建工具, 要么是不好用或不方便, 要么就是學習曲線太高。這些特點導致運維團隊投入過多的精力在鏡像的使用中, 進而導致工作效率以及敏捷性被阻礙。這就是為什么雖然鏡像的工作方式具有非常多的優勢,但是卻依舊沒有被大規模的普及。
Packer 依據單個的配置文件, 能做到流水線式 + 并發的創建鏡像,與傳統手工操作相比,其 " Infrastructure as Code" 的工作方式也大大減少了失誤的概率。
至少在 Packer 官方認為:
Packer brings pre-baked images into the modern age,
unlocking untapped potential and opening new opportunities.
Infrastructure as Code 的工作方式
在這個理念被提出之前, 手工+腳本的方式非常普遍, 手工容易出錯, 而腳本本身也要投入很多人力來進行維護。與此同時,一些主流的云服務廠商也在積極尋找更多的可能性。2019年4月, 在我們發布了 terraform-provider-jdcloud插件以后, 目前一些團隊在使用 Terraform 的京東云插件, 有的會在 Github 上留下 issues, 有的是通過留言,表示希望能增加更多功能。用戶的這些表現都從側面驗證了 "Infrastructure as Code" 工作方式的可靠性和敏捷性。
到了 Packer, 這些特性依舊被保留下來。相較于傳統方式,IaC 被認為是: "Modern and Automated" , 同樣是一份簡單的 json 配置文件,IaC 鼓勵開發者開始使用鏡像, 同時使用 Packer 自動化、流水線化地管理鏡像, 從而減少鏡像本身管理帶來的負擔。
介紹一些日常的使用場景
混合云的使用 :Packer 的一份配置可以為多個云服務商生成鏡像, 假設你使用 VMWare 作為開發環境, AWS 作為生產環境, 那么 Packer 能夠并發生成兩份鏡像用于兩家云服務商, 從而最大程度地減少兩個鏡像之間的區別。
詳細一些, Packer 還包含有這些優勢
在問題的追溯與定位上:在 Packer 上所有變化都是基于代碼的,而代碼是可以追溯的,方便快速定位問題并回滾。而在傳統方式中,考慮到手動操作的過程可能涉及多人,完整地追出問題并不是一件容易的事兒。
在便捷性與效率上:由于 Packer 上的操作基于代碼,變更的時候操作會非常快;而手動操作的效率則取決于個人的手速了。
安裝 Packer
安裝 Packer 我們推薦去 Packer官網 下載一個二進制包,解壓后直接就可以使用。另外對于 Mac OS X 用戶, 也可以使用 HomeBrew 直接進行安裝。
$ brew install packer
準備配置文件
在開始之前,你需要準備一份配置文件
jdcloud.json
,在配置文件里給出相應的參數。
配置文件的模板如下:
1{
2 "builders": [
3 {
4
5 # 服務商與身份信息
6 "type": "jdcloud",
7 "access_key": "<Your access_key>",
8 "secret_key": "<Your secret_key>",
9
10 # 云主機規格信息
11 "image_id": "<Base Image Id>",
12 "region_id": "cn-north-1",
13 "az": "cn-north-1c",
14 "instance_name": "packer_demo",
15 "instance_type": "g.n2.medium",
16 "ssh_password": "DevOps2018",
17 "image_name": "packer_image_demo",
18 "subnet_id": "subnet-jo6e38sdli",
19
20 # 登錄設置(不用改)
21 "communicator": "ssh",
22 "ssh_username": "root"
23 }
24 ],
25
26 "provisioners": [
27 {
28 "type": "shell",
29 "inline": [
30
31 # 云主機運行的腳本信息
32 "sleep 30",
33 "sudo apt update",
34 "sudo apt install nginx -y"
35 ]
36 }
37 ]
38}
云主機規格信息 :
這里包含:
云主機/地域/可用區/機型與規格
基礎鏡像: 可以是京東云官方提供的 Centos/Ubuntu,也可以是你的私人鏡像,將它的ID填寫在這里即可。
子網信息 : 可以為空,如果為空的話,我們會為你創建一個臨時的子網。
登錄密碼: 在這里我們選擇使用密碼來登錄,在這兒還有另一個示例,會告訴用戶如何使用秘鑰的方式來創建云主機鏡像。
使用配置文件開始創建鏡像
1bash
2~ $ packer build jdcloud.json
3
4==> jdcloud: Validating parameters...
5 jdcloud: validating your subnet:subnet-xxx
6 jdcloud: subnet found: Packer 測試子網
7 jdcloud: validating your base image:img-1iubdz7gzu
8 jdcloud: image found:Ubuntu 16.04 64位
9 jdcloud: Password detected, we are going to login with this password :)
10
11==> jdcloud: Creating instances
12 jdcloud: Creating public-ip
13 jdcloud: Associating public-ip with instance
14 jdcloud: Hi, we have created the instance, its name=packer_demo , its id=i-xxxx, and its eip=116.196.xx.xx :)
15
16==> jdcloud: Using ssh communicator to connect: 116.196.xx.xx
17==> jdcloud: Waiting for SSH to become available...
18==> jdcloud: Connected to SSH!
19==> jdcloud: Provisioning with shell script
20==> jdcloud: Stopping this instance
21 jdcloud: Instance has been stopped :)
22==> jdcloud: Creating images
23Build 'jdcloud' finished.
24
25
26==> Builds finished. The artifacts of successful builds are:
27--> jdcloud: A VMImage was created: img-riggr2xxx
在上面的創建過程中, 我們可以看到, 鏡像的創建過程大體可以分成四個階段:
階段-1 參數驗證階段: 在這個階段里我們將要去驗證參數的有效性,包括是否指定子網,需不需要創建臨時子網,給出的運行鏡像是否存在,是否指定使用密碼登錄或指定密鑰登錄。
階段-2 創建云主機階段: 在這個階段我們按照給出的云主機規格創建出一臺云主機,并創建出一個公網IP, 用于稍后登錄這臺云主機執行命令。
階段-3 執行命令階段: 命令的輸出都會打印在這里。
img-riggr2xxx
。創建出來的新鏡像,用戶可以拿來手動創建云主機,也可以通過 terraform 自動創建云主機。
更進一步地,如果考慮到服務的多地域性,用戶可能會希望為每個地域都創建出各自的專屬鏡像。這個時候,只需要在配置文件后面追加出其余地域的配置信息,Packer 就能在一次并發內完成所有鏡像的創建,很大程度的提升了鏡像創建的效率。
Packer 以其 "Infrastructure as Code" 的工作方式,在幫助用戶降低失誤故障風險的同時,提高了持續交付效率和業務可用性,解決了傳統鏡像創建方式在跨云平臺環境下的諸多弊端。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。