文档首页> 镜像服务 IMS> 最佳实践> 使用Packer创建私有镜像
更新时间:2022-04-12 GMT+08:00
分享

使用Packer创建私有镜像

Packer是一款可以创建自定义镜像的开源工具。Packer包含构建器(Builder)、配置器(Provisioner)、后处理器(Post-Processor)三个组件,通过json格式的模板文件,可以灵活组合这三种组件并行地、自动化地创建镜像文件。使用Packer通过配置代码的形式,降低了创建私有镜像复杂度,并且将创建镜像的过程变成可以配置管理代码的形式,在支持用户灵活定制个性化镜像的同时,也为镜像在不同云平台间的切换提供了一种新的途径。

本节以在CentOS 7.4 64bit云服务器中创建Ubuntu 16.04 Server 64bit私有镜像并上传到公有云平台为例,介绍使用Packer创建镜像的操作步骤。

约束与限制

不支持Packer使用整机镜像作为源镜像来创建私有镜像。

操作流程

安装Packer

  1. 登录管理控制台,创建一台弹性云服务器(以CentOS 7.4 64bit为例),并绑定弹性公网IP。
  2. 登录弹性云服务器。
  3. Packer工具下载页面选择与云服务器操作系统及架构类型相对应的Packer版本,版本号建议选择1.2.3到1.4.2之间。
  4. 执行以下命令,安装Packer(本节操作以packer_1.4.2_linux_amd64.zip为例)。

    wget --no-check-certificate https://releases.hashicorp.com/packer/1.4.2/packer_1.4.2_linux_amd64.zip

    • 需要提前给云服务器绑定弹性公网IP,以便能够访问外网。
    • 如果执行本步骤命令后报“command not found”的错误,说明没有预装wget工具,需要执行yum install wget进行安装。
  5. 执行以下命令,解压Packer安装包。

    unzip packer_1.4.2_linux_amd64.zip

  6. 执行以下命令,将Packer安装包移动至“/usr/local/bin”目录下。
    mv packer /usr/local/bin

    “/usr/local/bin”目录已被添加到环境变量,您也可以将Packer安装包移动至其它目录下,并确保该目录已被添加到环境变量中。

  7. 执行以下命令,查询Packer版本号,检查Packer是否安装成功。

    packer -v

    • 如果回显信息为Packer版本号,表示已完成Packer安装。
    • 如果回显信息为“command not found”,表示Packer安装失败,请检查Packer所在目录是否被添加到环境变量中。

      使用命令env | grep PATH打印环境变量,查看环境变量PATH是否包含Packer的安装目录。

      如果环境变量PATH中没有包含Packer安装目录,请依次使用以下命令,将Packer的安装路径添加到环境变量PATH中:

      1. 执行以下命令,打开profile文件。

        vim /etc/profile

      2. 按“i”键进入编辑模式,在文件末尾添加“export PATH=$PATH:/usr/local/bin”。

        请将/usr/local/bin换成您实际安装Packer的目录。

      3. 按“ESC”退出编辑模式,输入:wq,按回车键保存修改并退出。
      4. 执行以下命令,使修改生效。

        source /etc/profile

定义Packer模板

使用Packer创建镜像,需要一个json格式的模板文件。在模板文件中,您需要指定构建器配置器,还可以指定后处理器。在配置器中,您可以指定对源镜像的任何操作,可以指定安装软件也可以对相关配置做修改。在本示例中,我们使用后处理器重定向manifest的输出路径,如果您的Packer模板文件中有多个builders(构建器),你可以通过manifest的输出内容,找到每个builder创建镜像的ID。关于构建器、配置器以及后处理器的详细介绍请参考Packer官方文档

本节操作以Shell配置器为例。

  1. 执行以下命令,创建hwcloud.json文件。

    touch hwcloud.json

  2. 执行以下命令,打开hwcloud.json文件。

    vim hwcloud.json

  3. 按“i”进入编辑模式,根据实际需求编写模板,以下内容仅供参考,参数列表请查看表1
    {
      "builders": [{
        "type": "openstack",
        "identity_endpoint": "https://iam.xxx.com/v3",
        "tenant_name": "xxx",
        "domain_name": "domain_name", 
        "username": "username",
        "password": "password",
        "ssh_username": "root",
        "region": "xxx",
        "image_name": "Ubuntu-image-updating-powered-by-Packer",
        "instance_name": "Ubuntu-image-updating-powered-by-Packer",
        "source_image": "f1dd2272-7041-479e-9663-646632b6ac00",
        "availability_zone": "xxx",
        "flavor": "s3.medium.2",
        "use_blockstorage_volume": true,
        "networks": ["11d661c4-e41f-487f-a6f6-9b88d623dd5d"],
        "floating_ip": "8f686f9a-3408-4fdd-be75-ea768065800c"
      }],
      "provisioners": [{
        "inline": [
          "apt-get update -y"
        ],
        "inline_shebang": "/bin/sh -x",
        "type": "shell",
        "skip_clean": true
      }],
      "post-processors": [{
        "strip_path": true,
        "output": "packer-template-ubuntu-updating-result.log",
        "type": "manifest"
      }]
    }

    表1中,tenant_name、region、availability_zone、flavor、networks、floating_ip均为创建私有镜像时使用的云服务器的属性信息。

    表1 Packer模板参数列表

    参数

    描述

    是否为必选

    type

    保持默认值“openstack”。

    identity_endpoint

    身份鉴别节点地址,格式为:https://IAM的Endpoint/v3

    其中,IAM的Endpoint可参考地区和终端节点获取。

    tenant_name

    项目名称。获取方式:

    1. 在管理控制台页面,鼠标悬停在右上角的用户名,选择“我的凭证”。
    2. 在“API凭证”页面获取项目名称(项目列表中的“项目”列)。

    domain_name

    帐号名。获取方式:

    1. 在管理控制台页面,鼠标悬停在右上角的用户名,选择“我的凭证”。
    2. 在“API凭证”页面获取帐号名。

    username

    IAM用户名。获取方式:

    1. 在管理控制台页面,鼠标悬停在右上角的用户名,选择“我的凭证”。
    2. 在“API凭证”页面获取IAM用户名。

    password

    管理控制台的登录密码。

    ssh_username

    待创建私有镜像的ssh登录用户名。

    region

    区域名称。参考地区和终端节点获取。

    image_name

    待创建私有镜像的名称。

    instance_name

    创建私有镜像时生成的临时实例的名称。此项如果不填写,系统会随机分配。

    source_image

    源镜像ID,可以从镜像服务控制台公共镜像列表获取。当然,如果您已有Ubuntu 16.04 Server 64bit系统的私有镜像,想通过Packer进行改造,此处也可以填写该私有镜像的ID。

    availability_zone

    可用区。参考地区和终端节点获取。

    flavor

    云服务器的规格。

    use_blockstorage_volume

    使用系统盘导出镜像,而不是整台服务器创建镜像。

    是,且值必须设置为true。

    networks

    VPC子网网络ID。

    floating_ip

    弹性公网IP的ID。

    如果在Packer创建的镜像实例中需要使用外网,那么该配置项必选。

    provisioners

    创建私有镜像时使用的Packer配置器类型。详情请参见Packer配置器

    post-processors

    创建私有镜像时使用的Packer后处理器类型。

使用Packer创建镜像

  1. Packer模板文件制作完成后,请执行以下命令创建镜像。

    packer build hwcloud.json

    运行结果如下所示:

    openstack output will be in this color.
    
    ==> openstack: Loading flavor: s3.small.1
        openstack: Verified flavor. ID: s3.small.1
    ==> openstack: Creating temporary keypair: packer_5be8d358-2cc6-66a4-f1b5-31e8587c7bfa ...
    ==> openstack: Created temporary keypair: packer_5be8d358-2cc6-66a4-f1b5-31e8587c7bfa
    ==> openstack: Launching server...
    ==> openstack: Launching server...
        openstack: Server ID: fcf2014e-2f70-46c5-80d5-870ae0d1e659
    ==> openstack: Waiting for server to become ready...
        openstack: Selected floating IP: '8f686f9a-3408-4fdd-be75-ea768065800c' (119.3.67.11)
    ==> openstack: Associating floating IP '8f686f9a-3408-4fdd-be75-ea768065800c' (119.3.67.11) with instance port...
        openstack: Added floating IP '8f686f9a-3408-4fdd-be75-ea768065800c' (119.3.67.11) to instance!
    ==> openstack: Using ssh communicator to connect: 119.3.67.11
    ==> openstack: Waiting for SSH to become available...
    ==> openstack: Connected to SSH!
    ==> openstack: Provisioning with shell script: /tmp/packer-shell133419321
        openstack: + apt-get update -y
        openstack: Hit:1 http://archive.ubuntu.com/ubuntu xenial InRelease
               ......
        openstack: Fetched 7,088 kB in 9s (778 kB/s)
        openstack: Reading package lists...
    ==> openstack: Stopping server: fcf2014e-2f70-46c5-80d5-870ae0d1e659 ...
        openstack: Waiting for server to stop: fcf2014e-2f70-46c5-80d5-870ae0d1e659 ...
    ==> openstack: Creating the image: CentOS-image-updating-powered-by-Packer
        openstack: Image: 9eccbb17-9aed-4beb-bf44-1e8c80448ba3
    ==> openstack: Waiting for image CentOS-image-updating-powered-by-Packer (image id: 9eccbb17-9aed-4beb-bf44-1e8c80448ba3) to become ready...
    ==> openstack: Terminating the source server: fcf2014e-2f70-46c5-80d5-870ae0d1e659 ...
    ==> openstack: Deleting temporary keypair: packer_5be8d358-2cc6-66a4-f1b5-31e8587c7bfa ...
    ==> openstack: Running post-processor: manifest
    Build 'openstack' finished.
    
    ==> Builds finished. The artifacts of successful builds are:
    --> openstack: An image was created: 9eccbb17-9aed-4beb-bf44-1e8c80448ba3
    --> openstack:
  2. 命令执行成功后,登录控制台,选择“计算 > 镜像服务”。
  3. 在“私有镜像”列表页面,查看使用Packer创建的镜像,如图1所示。
    图1 查看使用Packer创建的镜像
分享:

    相关文档

    相关产品

close