什么是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 直接进行安装。

  1. $ brew install packer

准备配置文件

在开始之前,你需要准备一份配置文件jdcloud.json,在配置文件里给出相应的参数。

配置文件的模板如下:

  1. {
  2. "builders": [
  3. {
  4. # 服务商与身份信息
  5. "type": "jdcloud",
  6. "access_key": "<Your access_key>",
  7. "secret_key": "<Your secret_key>",
  8. # 云主机规格信息
  9. "image_id": "<Base Image Id>",
  10. "region_id": "cn-north-1",
  11. "az": "cn-north-1c",
  12. "instance_name": "packer_demo",
  13. "instance_type": "g.n2.medium",
  14. "ssh_password": "DevOps2018",
  15. "image_name": "packer_image_demo",
  16. "subnet_id": "subnet-jo6e38sdli",
  17. # 登录设置(不用改)
  18. "communicator": "ssh",
  19. "ssh_username": "root"
  20. }
  21. ],
  22. "provisioners": [
  23. {
  24. "type": "shell",
  25. "inline": [
  26. # 云主机运行的脚本信息
  27. "sleep 30",
  28. "sudo apt update",
  29. "sudo apt install nginx -y"
  30. ]
  31. }
  32. ]
  33. }
  • 服务商与身份信息 : 服务提供商-jdcloud, 其次你需要提供你的AccessKey/SecretKey 向我们说明你的身份。
  • 云主机规格信息 :

    这里包含:

云主机/地域/可用区/机型与规格

基础镜像: 可以是京东云官方提供的 Centos/Ubuntu,也可以是你的私人镜像,将它的ID填写在这里即可。

子网信息: 可以为空,如果为空的话,我们会为你创建一个临时的子网。

登录密码: 在这里我们选择使用密码来登录,在这儿还有另一个示例,会告诉用户如何使用秘钥的方式来创建云主机镜像。

  • 运行命令: 在这里作为示例,我们选择安装一个 nginx。

使用配置文件开始创建镜像

  1. bash
  2. ~ $ packer build jdcloud.json
  3. ==> jdcloud: Validating parameters...
  4. jdcloud: validating your subnet:subnet-xxx
  5. jdcloud: subnet found: Packer 测试子网
  6. jdcloud: validating your base image:img-1iubdz7gzu
  7. jdcloud: image found:Ubuntu 16.04 64
  8. jdcloud: Password detected, we are going to login with this password :)
  9. ==> jdcloud: Creating instances
  10. jdcloud: Creating public-ip
  11. jdcloud: Associating public-ip with instance
  12. jdcloud: Hi, we have created the instance, its name=packer_demo , its id=i-xxxx, and its eip=116.196.xx.xx :)
  13. ==> jdcloud: Using ssh communicator to connect: 116.196.xx.xx
  14. ==> jdcloud: Waiting for SSH to become available...
  15. ==> jdcloud: Connected to SSH!
  16. ==> jdcloud: Provisioning with shell script
  17. ==> jdcloud: Stopping this instance
  18. jdcloud: Instance has been stopped :)
  19. ==> jdcloud: Creating images
  20. Build 'jdcloud' finished.
  21. ==> Builds finished. The artifacts of successful builds are:
  22. --> 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使用教程的更多相关文章

  1. DevOps专题 |监控,可观测性与数据存储

    对于DevOps而言,监控是其中重要的一环,上一次的专题内容中,我们与大家分享了大型企业级监控系统的设计.今天我们将和大家从另一个角度进一步探讨互联网工程技术领域的监控设计(monitoring):系 ...

  2. DevOps专题|玩转Kubernetes网络

    Kubernetes无疑是当前最火热的容器编排工具,网络是kubernetes中非常重要的一环, 本文主要介绍一些相应的网络原理及术语,以及kubernetes中的网络方案和对比. Kubernete ...

  3. DevOps专题|Lua引擎打造超轻量级客户端

    Lua 作为一门轻量级脚本语言,源码使用标准C语言发布,语法简洁,非常适合嵌入式.客户端.游戏等场景. Lua引擎语言特点 轻量级 源码简单,以lua最新版5.3.5为例,加上lua自身提供的lib库 ...

  4. DevOps专题 | 大型企业级监控系统设计

    10月30日,全球权威数据调研机构IDC正式发布<IDCMarketScape: 中国DevOps云市场2019,厂商评估>报告.京东云凭借丰富的场景和实践能力,以及高质量的服务交付和平台 ...

  5. DevOps专题|基础Agent部署系统

    随着京东云业务规模.管理机器规模的扩大,各类agent也在逐渐增多,如日志agent.监控agent.控制系统agent等.这对agent的部署.升级.状态维护提出了很高的要求,一旦某个全局agent ...

  6. [转载]逐步建设企业DevOps能力

    当软件行业进入互联网时代,市场对软件产品和服务的交付提出了更高的要求:不仅要快速实现需求,而且要快速发布上线,并且必须保证业务可靠.高效运行.为了满足这些要求,IT组织需要强有力的流程.技术和人员作为 ...

  7. [转载] DevOps年中盘点:国外最受欢迎的10篇技术文章

    本文根据高效运维系列微信群的群友投稿整理而成.“高效运维”公众号作为本系列群的官方唯一公众号,原创并独家首发. 欢迎关注“高效运维”公众号,以免费参加「运维讲坛」每月一次的线下交流活动:并抢先赏阅干货 ...

  8. Fbric、Ansible、Docker、Chaos Monkey:DevOps工具的年中回顾

    Fbric.Ansible.Docker.Chaos Monkey:DevOps工具的年中回顾 [编者按]近日,Cyber Engineering Solutions Group 技术经理 Hasan ...

  9. DevOps之服务器

    唠叨话 关于德语噢屁事的知识点,仅提供专业性的精华汇总,具体知识点细节,参考教程网址,如需帮助,请留言. <服务器(Server)> DevOps之服务器划分为三部分:系统.虚拟化.器件. ...

随机推荐

  1. html css3

    一.引入样式 1.行内样式表 <h1 style="color: red;font-size: 18px;">10-30</h1> 2.内部样式表(在hea ...

  2. gitlab clone或者pull 仓库

    今天在学git操作,想从gitlab上面clone下来并操作一下,但是一直出现 没有权限的错误,一直搞不定 后来才知道,需要ssh密钥才可以 ssh-keygen -t rsa -C "ex ...

  3. zabbix 监控linux tcp连接数

    zabbix 监控linux tcp连接数 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.TCP的状态概述 1>.端口状态转换 2>.TCP 三次握手 3>. ...

  4. PV 动态供给【转】

    前面的例子中,我们提前创建了 PV,然后通过 PVC 申请 PV 并在 Pod 中使用,这种方式叫做静态供给(Static Provision). 与之对应的是动态供给(Dynamical Provi ...

  5. 【LeetCode】加油站

    [问题]在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升. 你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升.你从其中 ...

  6. [U53204] 树上背包的优化

    题目链接 本文旨在介绍树上背包的优化. 可见例题,例题中N,M∈[1,100000]N,M \in [1,100000]N,M∈[1,100000]的数据量让O(nm2)O(nm^2)O(nm2)的朴 ...

  7. 08.swoole学习笔记--异步tcp客户端

    <?php //创建异步tcp客户端 $client=new swoole_client(SWOOLE_SOCK_TCP,SWOOLE_SOCK_ASYNC); //注册连接成功的回调函数 $c ...

  8. println 与 print区别

    ------------恢复内容开始------------ println 与 print区别: 1.print输出之后不换行,如下: public class Newstart {    publ ...

  9. 0-java概述

    目录 Java发展历史 java规范 Java三大分支 Java SE学习路径 HelloWorld 1.Java发展历史 - Java出身于sun公司 - sun公司被Oracle公司收购 2.ja ...

  10. JAVA学习笔记-数组的三种初始化方式

      package Study; public class TestArray02 { public static void main(String[] args){//声明 int[] a; int ...