Fork me on GitHub

Packer之Packer应用场景及常用概念介绍

Packer之Packer应用场景及常用概念介绍

Packer应用场景分析

场景1:自定义镜像

用户需要定制特定版本的操作系统镜像,制作过程复杂,技术要求高,而且制作周期长。而使用packer,镜像的上传变的自动化,并且提供了一些可以参考的基础模板,用户只需要修改源ISO,就可以创建出指定版本的基础镜像,大大降低了镜像制作的门槛。

场景2:镜像更安全,制作更效率

镜像市场中第三方镜像包含的内容是什么,对平台和用户都是不透明的。无法清晰的看到镜像中是否有安全隐患。为了确保安全,需要进行大量的安全扫描,一方面,使用发布第三方镜像的周期更长,另一方面,通过扫描二进制文件,很难完全避免安全风险。通过packer模板文件制作的镜像,我们可以清晰的看到脚本中执行的命令,相比二进制文件,安全扫描也更容易,同时也方便做镜像的版本管理,及多平台的镜像制作,提高镜像制作效率,不需要一遍遍的手动制作。

场景3:弹性伸缩场景下,镜像的制作问题

在弹性伸缩场景中,镜像的生成是否方便高效起着重要的作用,当检测到工作负载达到阀值的时候,需要使用镜像来生成新的实例,当弹性伸缩的应用数量达到一定规模的时候,通过手工来创建镜像是难以接受的。特别是当需要升级应用时,如果使用传统的方式,直接在运行时实例上在线升级应用,一方面,在线升级的速度较慢,而且会影响在线用户的检验,另一方面,当出现错误的时候,回滚也比较困难,很容易形成较长时间的当机,而采用Packer,结合Jenkins和Terraform等工具,能够将应用的从代码到镜像升级,产生更新后实例的过程完全自动化。当Jenkins检测到有代码提交时,可以触发Packer根据模板使用更新后代码创建新的镜像,然后Jenkins触发Terraform来创建新ECS实例,将新实例加入伸缩组,并将旧实例移出伸缩组,这样就完成了应用的更新,当检测到新代码出现问题的时候,又可以将旧实例重新加入伸缩组而移除新实例来完成回滚。

Packer术语

  • artifacts
    单个构建的结果,通常是一组ID或文件来表示机器images。每个构建器都会生成一个工件。例如,对于Amazon EC2构建器,工件时一组AMI ID。对于VMware构建器,工件时包含已创建虚拟机的文件目录

  • builds
    是一项单一任务,最终为单个平台生成images。多个构建并行运行。句子中的用法示例:packer构建生成了一个AMI来运行我们的web应用程序。或者packer现在正在为VMware,AWS或VirtualBox运行构建。

  • builders
    是Packer组件,能够为单个平台创建机器images。构建器读取一些配置并使用它来运行和生成机器images。构建器作为构建的一部分被调用,以便创建实际的结果images。示例构建器包括VMware,AWS或VirtualBox。可以以插件的形式创建构建器并将其添加到Packer。

  • Commands
    是Packer执行某项工作的程序的子命令。示例命令是build,它被调用为packer build。packer附带一组开箱即用的命令,以便定义其命令行界面。

  • post-Processors
    Packer的组件,它获取构建器或其他后处理器的结果,并处理该组件以创建新工件。后处理器的示例是压缩以压缩工件,上传到上载工件等。

  • Provisioners
    Packer的组件是在该机器被转换为静态映像之前在正在运行的机器中安装和配置软件的组件。他们执行使图像包含有用软件的主要工作。示例配置文件包括shell脚本,Chef,Puppet等。

  • Templates
    是JSON文件,它通过配置Packer的各种组件来定义一个或多个构建。Packer能够读取模板并使用该信息并行创建多个机器映像。

模板文件案例讲解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# cat template.json
{
"variables": {
"access_key": "{{env `ALICLOUD_ACCESS_KEY`}}",
"secret_key": "{{env `ALICLOUD_SECRET_KEY`}}"
},
"builders": [{
"type":"alicloud-ecs",
"access_key":"{{user `access_key`}}",
"secret_key":"{{user `secret_key`}}",
"region":"cn-beijing",
"image_name":"codepipe_demo",
"source_image":"ubuntu_16_0402_64_40G_alibase_20170711.vhd",
"ssh_username":"root",
"instance_type":"ecs.n1.medium",
"io_optimized":"true",
"image_force_delete":"true",
"ssh_password":"Test12345"
}],
"provisioners": [{
"type": "shell",
"inline": [
"apt-get update -yy",
"apt-get install openjdk-8-jdk tomcat8 -yy",
"mkdir -p /var/lib/tomcat8/webapps/"
]
},
{
"type": "file",
"source": "target/demo.war",
"destination": "/var/lib/tomcat8/webapps/"
}]
}

注释:

  • variables:部分用于定义各类变量,最常用的各个平台的API key及secret、region等等
  • builders:部分为单个平台images构建镜像所需的配置信息
  • provisioners: 机器在被转为静态镜像之前进行的自定义软件及配置操作,可以是shell脚本,或者其他配置管理工具Ansible、Chef等编排脚本。

======================================================
希望各位朋友支持一下

本文作者:dongsheng
本文地址https://mds1455975151.github.io/archives/22e81506.html
版权声明:转载请注明出处!

坚持技术分享,您的支持将鼓励我继续创作!