DevOps專題|Packer使用教程

京東科技開發者發表於2020-01-09

DevOps專題|Packer使用教程

什麼是Packer


簡單介紹一下自己

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&Chef&Puppet Packer 因其自身體積輕量的特點, 使其被直接放到流水線裡併成為流水線的一環也變成了一種可能的選擇: 在 Chef/Puppet 的配置產生變動的時候觸發流水線, 下一環 Packer 負責為新配置生成映象, 這些映象可以立刻投入測試, 測試透過後即可部署到生產環境。

  • 混合雲的使用 Packer 的一份配置可以為多個雲服務商生成映象, 假設你使用 VMWare 作為開發環境, AWS 作為生產環境, 那麼 Packer 能夠併發生成兩份映象用於兩家雲服務商, 從而最大程度地減少兩個映象之間的區別。


詳細一些, Packer 還包含有這些優勢

  • 對於臨時產物的處理上: Packer 能為你建立一些臨時資源,比如在沒有指定子網的情況下,Packer 能夠幫你建立一個臨時子網,用於安放雲主機。並且在出現錯誤的時候終止任務,同時自動清理中間產物。而傳統方式則需要自己先建立一個臨時子網,並且出現錯誤時還需要手動清理。

  • 在問題的追溯與定位上:在 Packer 上所有變化都是基於程式碼的,而程式碼是可以追溯的,方便快速定位問題並回滾。而在傳統方式中,考慮到手動操作的過程可能涉及多人,完整地追出問題並不是一件容易的事兒。


  • 在便捷性與效率上:由於 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}
  • 服務商與身份資訊 :  服務提供商-jdcloud, 其次你需要提供你的AccessKey/SecretKey 向我們說明你的身份。

  • 雲主機規格資訊 :
    這裡包含:

雲主機/地域/可用區/機型與規格

基礎映象:  可以是京東雲官方提供的 Centos/Ubuntu,也可以是你的私人映象,將它的ID填寫在這裡即可。

子網資訊 : 可以為空,如果為空的話,我們會為你建立一個臨時的子網。

登入密碼:  在這裡我們選擇使用密碼來登入,在這兒還有另一個示例,會告訴使用者如何使用秘鑰的方式來建立雲主機映象。

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


使用配置檔案開始建立映象

 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. 階段-1 引數驗證階段: 在這個階段裡我們將要去驗證引數的有效性,包括是否指定子網,需不需要建立臨時子網,給出的執行映象是否存在,是否指定使用密碼登入或指定金鑰登入。


  2. 階段-2 建立雲主機階段: 在這個階段我們按照給出的雲主機規格建立出一臺雲主機,並建立出一個公網IP, 用於稍後登入這臺雲主機執行命令。


  3. 階段-3 執行命令階段: 命令的輸出都會列印在這裡。


  4. 階段-4 建立映象階段: Packer 會將這臺雲主機建立出一個映象,並儲存到映象倉庫裡, 在上面我們可以看到對應的映象ID為: img-riggr2xxx

建立出來的新映象,使用者可以拿來手動建立雲主機,也可以透過 terraform 自動建立雲主機。

更進一步地,如果考慮到服務的多地域性,使用者可能會希望為每個地域都建立出各自的專屬映象。這個時候,只需要在配置檔案後面追加出其餘地域的配置資訊,Packer 就能在一次併發內完成所有映象的建立,很大程度的提升了映象建立的效率。

Packer 以其 "Infrastructure as Code" 的工作方式,在幫助使用者降低失誤故障風險的同時,提高了持續交付效率和業務可用性,解決了傳統映象建立方式在跨雲平臺環境下的諸多弊端。

看了這篇文章,您是否對Packer有一個全面的瞭解呢?如果您想了解更多關於京東雲翼的相關訊息,請點選“ 這裡”,進入京東雲官網瞭解相關產品噢~
歡迎點選“ 京東雲 ”瞭解更多精彩內容

DevOps專題|Packer使用教程

DevOps專題|Packer使用教程


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69912185/viewspace-2672630/,如需轉載,請註明出處,否則將追究法律責任。

相關文章