溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

DevOps專題|Packer使用教程

發(fā)布時間:2020-08-09 21:19:29 來源:ITPUB博客 閱讀:192 作者:京東云技術(shù)新知 欄目:開發(fā)技術(shù)

DevOps專題|Packer使用教程

什么是Packer


簡單介紹一下自己

Packer 是一個輕量命令行工具, 能在幾乎所有主流的操作系統(tǒng)上運行。

在給定一份配置文件的情況下, Packer 能為多種系統(tǒng)架構(gòu)創(chuàng)建云主機鏡像。同時 Packer 自身也能夠做到多鏡像并發(fā)創(chuàng)建, 大大節(jié)省了鏡像創(chuàng)建過程中的時間成本。


為什么要用 Packer

為什么呢?

當然是因為使用預(yù)制的鏡像有非常多的好處, 最簡單來說,就是能最大程度地保證不同機器上服務(wù)的一致性(以經(jīng)驗來看這一點非常重要)。但是在實際使用中, 鏡像因其創(chuàng)建/管理的工作單調(diào)且復雜, 很多情況下鏡像還沒有被完全普及。

現(xiàn)有的鏡像自動化創(chuàng)建工具, 要么是不好用或不方便, 要么就是學習曲線太高。這些特點導致運維團隊投入過多的精力在鏡像的使用中, 進而導致工作效率以及敏捷性被阻礙。這就是為什么雖然鏡像的工作方式具有非常多的優(yōu)勢,但是卻依舊沒有被大規(guī)模的普及。

Packer 依據(jù)單個的配置文件, 能做到流水線式 + 并發(fā)的創(chuàng)建鏡像,與傳統(tǒng)手工操作相比,其 " Infrastructure as Code" 的工作方式也大大減少了失誤的概率。

至少在 Packer 官方認為:

Packer brings pre-baked images into the modern age,
unlocking untapped potential and opening new opportunities.


Infrastructure as Code 的工作方式

在這個理念被提出之前, 手工+腳本的方式非常普遍, 手工容易出錯, 而腳本本身也要投入很多人力來進行維護。與此同時,一些主流的云服務(wù)廠商也在積極尋找更多的可能性。2019年4月, 在我們發(fā)布了  terraform-provider-jdcloud插件以后, 目前一些團隊在使用 Terraform 的京東云插件, 有的會在 Github 上留下 issues, 有的是通過留言,表示希望能增加更多功能。用戶的這些表現(xiàn)都從側(cè)面驗證了 "Infrastructure as Code" 工作方式的可靠性和敏捷性。

到了 Packer, 這些特性依舊被保留下來。相較于傳統(tǒng)方式,IaC 被認為是: "Modern and Automated" , 同樣是一份簡單的 json 配置文件,IaC 鼓勵開發(fā)者開始使用鏡像, 同時使用 Packer 自動化、流水線化地管理鏡像, 從而減少鏡像本身管理帶來的負擔。


介紹一些日常的使用場景

  • 持續(xù)交付 - Packer&Chef&Puppet Packer 因其自身體積輕量的特點, 使其被直接放到流水線里并成為流水線的一環(huán)也變成了一種可能的選擇: 在 Chef/Puppet 的配置產(chǎn)生變動的時候觸發(fā)流水線, 下一環(huán) Packer 負責為新配置生成鏡像, 這些鏡像可以立刻投入測試, 測試通過后即可部署到生產(chǎn)環(huán)境。
  • 混合云的使用 Packer 的一份配置可以為多個云服務(wù)商生成鏡像, 假設(shè)你使用 VMWare 作為開發(fā)環(huán)境, AWS 作為生產(chǎn)環(huán)境, 那么 Packer 能夠并發(fā)生成兩份鏡像用于兩家云服務(wù)商, 從而最大程度地減少兩個鏡像之間的區(qū)別。


詳細一些, Packer 還包含有這些優(yōu)勢

  • 對于臨時產(chǎn)物的處理上: Packer 能為你創(chuàng)建一些臨時資源,比如在沒有指定子網(wǎng)的情況下,Packer 能夠幫你創(chuàng)建一個臨時子網(wǎng),用于安放云主機。并且在出現(xiàn)錯誤的時候終止任務(wù),同時自動清理中間產(chǎn)物。而傳統(tǒng)方式則需要自己先創(chuàng)建一個臨時子網(wǎng),并且出現(xiàn)錯誤時還需要手動清理。
  • 在問題的追溯與定位上:在 Packer 上所有變化都是基于代碼的,而代碼是可以追溯的,方便快速定位問題并回滾。而在傳統(tǒng)方式中,考慮到手動操作的過程可能涉及多人,完整地追出問題并不是一件容易的事兒。

  • 在便捷性與效率上:由于 Packer 上的操作基于代碼,變更的時候操作會非常快;而手動操作的效率則取決于個人的手速了。

  • 在操作的可重復性上: Packer 依據(jù)配置文件,隨時快速重新操作;而在全手動的情況下, 想要完整的復現(xiàn)一次所有操作并不容易。Packer 上代碼的可重復利用也說明你可以用最快的速度再創(chuàng)建一個一模一樣的(測試)環(huán)境。

立刻開始使用 Packer


安裝 Packer

安裝 Packer 我們推薦去  Packer官網(wǎng)  下載一個二進制包,解壓后直接就可以使用。另外對于 Mac OS X 用戶, 也可以使用 HomeBrew 直接進行安裝。

$ brew install packer

準備配置文件

在開始之前,你需要準備一份配置文件 jdcloud.json ,在配置文件里給出相應(yīng)的參數(shù)。

配置文件的模板如下:

 1{

2  "builders": [
3    {
4
5      # 服務(wù)商與身份信息
6      "type":             "jdcloud",
7      "access_key":       "<Your access_key>",
8      "secret_key":       "<Your secret_key>",
9
10      # 云主機規(guī)格信息
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      # 登錄設(shè)置(不用改)
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}
  • 服務(wù)商與身份信息 :  服務(wù)提供商-jdcloud, 其次你需要提供你的AccessKey/SecretKey 向我們說明你的身份。
  • 云主機規(guī)格信息 :
    這里包含:

云主機/地域/可用區(qū)/機型與規(guī)格

基礎(chǔ)鏡像:  可以是京東云官方提供的 Centos/Ubuntu,也可以是你的私人鏡像,將它的ID填寫在這里即可。

子網(wǎng)信息 : 可以為空,如果為空的話,我們會為你創(chuàng)建一個臨時的子網(wǎng)。

登錄密碼:  在這里我們選擇使用密碼來登錄,在這兒還有另一個示例,會告訴用戶如何使用秘鑰的方式來創(chuàng)建云主機鏡像。

  • 運行命令: 在這里作為示例,我們選擇安裝一個 nginx。


使用配置文件開始創(chuàng)建鏡像

 1bash

2~ $ packer build jdcloud.json
3
4==> jdcloud: Validating parameters...
5    jdcloud: validating your subnet:subnet-xxx
6    jdcloud: subnet found: Packer 測試子網(wǎng)
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

在上面的創(chuàng)建過程中, 我們可以看到, 鏡像的創(chuàng)建過程大體可以分成四個階段:

  1. 階段-1 參數(shù)驗證階段: 在這個階段里我們將要去驗證參數(shù)的有效性,包括是否指定子網(wǎng),需不需要創(chuàng)建臨時子網(wǎng),給出的運行鏡像是否存在,是否指定使用密碼登錄或指定密鑰登錄。

  2. 階段-2 創(chuàng)建云主機階段: 在這個階段我們按照給出的云主機規(guī)格創(chuàng)建出一臺云主機,并創(chuàng)建出一個公網(wǎng)IP, 用于稍后登錄這臺云主機執(zhí)行命令。

  3. 階段-3 執(zhí)行命令階段: 命令的輸出都會打印在這里。

  4. 階段-4 創(chuàng)建鏡像階段: Packer 會將這臺云主機創(chuàng)建出一個鏡像,并保存到鏡像倉庫里, 在上面我們可以看到對應(yīng)的鏡像ID為: img-riggr2xxx

創(chuàng)建出來的新鏡像,用戶可以拿來手動創(chuàng)建云主機,也可以通過 terraform 自動創(chuàng)建云主機。

更進一步地,如果考慮到服務(wù)的多地域性,用戶可能會希望為每個地域都創(chuàng)建出各自的專屬鏡像。這個時候,只需要在配置文件后面追加出其余地域的配置信息,Packer 就能在一次并發(fā)內(nèi)完成所有鏡像的創(chuàng)建,很大程度的提升了鏡像創(chuàng)建的效率。

Packer 以其 "Infrastructure as Code" 的工作方式,在幫助用戶降低失誤故障風險的同時,提高了持續(xù)交付效率和業(yè)務(wù)可用性,解決了傳統(tǒng)鏡像創(chuàng)建方式在跨云平臺環(huán)境下的諸多弊端。
看了這篇文章,您是否對Packer有一個全面的了解呢?如果您想了解更多關(guān)于京東云翼的相關(guān)訊息,請點擊“ 這里”,進入京東云官網(wǎng)了解相關(guān)產(chǎn)品噢~
歡迎點擊“ 京東云 ”了解更多精彩內(nèi)容

DevOps專題|Packer使用教程

DevOps專題|Packer使用教程

向AI問一下細節(jié)
推薦閱讀:
  1. MongoDB專題
  2. 緩存專題

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI