DevOps专题|Packer使用教程

什么是Packer

简单介绍一下本身nginx

Packer 是一个轻量命令行工具, 能在几乎全部主流的操做系统上运行。shell

在给定一份配置文件的状况下, Packer 能为多种系统架构建立云主机镜像。同时 Packer 自身也可以作到多镜像并发建立, 大大节省了镜像建立过程当中的时间成本。json

为何要用 Packerbash

为何呢?架构

固然是由于使用预制的镜像有很是多的好处, 最简单来讲,就是能最大程度地保证不一样机器上服务的一致性(以经验来看这一点很是重要)。可是在实际使用中, 镜像因其建立/管理的工做单调且复杂, 不少状况下镜像尚未被彻底普及。并发

现有的镜像自动化建立工具, 要么是很差用或不方便, 要么就是学习曲线过高。这些特色致使运维团队投入过多的精力在镜像的使用中, 进而致使工做效率以及敏捷性被阻碍。这就是为何虽然镜像的工做方式具备很是多的优点,可是却依旧没有被大规模的普及。app

Packer 依据单个的配置文件, 能作到流水线式 + 并发的建立镜像,与传统手工操做相比,其 "Infrastructure as Code" 的工做方式也大大减小了失误的几率。运维

至少在 Packer 官方认为:ssh

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

Infrastructure as Code 的工做方式ide

在这个理念被提出以前, 手工+脚本的方式很是广泛, 手工容易出错, 而脚本自己也要投入不少人力来进行维护。与此同时,一些主流的云服务厂商也在积极寻找更多的可能性。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有一个全面的了解呢?若是您想了解更多关于京东云翼的相关讯息,请点击“这里”,进入京东云官网了解相关产品噢~

欢迎点击“京东云”了解更多精彩内容

相关文章
相关标签/搜索