使用Paker管理云上镜像

引言

Paker 是 开源软件公司 Hashicorp 在虚拟机镜像管理上的又一力作,主要通过配置文件来定义镜像的构建过程、适配大部分公有云和私有云厂商(Hashicorp在虚拟机镜像领域的另一个作品Vagrant主要是解决本地开发环境下的虚拟机管理的)。

从Vagrant,Paker,再到Terraform,Hashicorp的多云管理解决方案都离不开通过配置文件去定义基础设施这个“套路”,想要了解Paker就先从基础设施即代码(Infrastructure as Code)这个理念出发吧。

基础设施即代码的概念

在传统机房时代,对于IT基础设施的配置和维护只能通过各硬件提供商的操作面板,需要人工去"点点点",即使有Chef、Puppet、Ansible 这样的配置管理工具,但它们也是在服务器等基础设施建立起来之后,进行一些软件和文件系统层面的配置。

随着云计算的普及,以及云的"可编程"特点(OpenStack、AWS等IaaS产品都有对外提供API来操作资源),使基础设施即代码成为可能。

基础设施即代码通常是云提供商对外提供一种可以使用模板文件声明式地定义云上资源(服务器、安全组、账号等),并且当用户提交模板文件时可以创建、更改或删除相应的云上资源。这样,基础设施就被代码化了,用户可以对这些模板文件进行编排和版本管理来高效地部署和维护云上资源。

适用场景: 适用于部署和维护中大规模的基础设施环境,并且有频繁销毁重建、迁移到其他区域、符合合规性、支持回退等需求。

Iac中的最佳实践以及实现途径

  1. 可重现(reproducible)

    在传统的手工配置基础设施的时代,即使所有服务器共用一个基础镜像,但是在运行过程中也会因为不同管理员在不同服务器上解决特定问题而改变服务器中的库依赖或者其他资源等,造成配置漂移(configuration drift),以至于不同服务器形态各异,而且手工操作没有记录,无法重现。

    可重现要求对基础设施的变更都是有记录,可以复现任一阶段的基础设施状态。
    具体可以从以下两个点入手:

    • 自描述(self-documented):
      基础设施的模板文件中可以清楚地描述基础设施的创建或变更步骤。比如在 Packer 中,镜像的构建步骤都通过一个 json 文件来描述,只要是通过 Packer 构建的镜像,之后谁都可以通过它的 json 文件再重新构建一个完全相同的镜像,包括镜像中装了哪些版本的软件都可以描述清楚

    • 版本管理:
      将基础设施对应的模板文件纳入版本管理系统(比如git),就可以实现版本管理。

  2. 测试

    在应用软件的开发中,常常要对应用进行功能测试和性能测试。然而在基础设施的发布流水线中,我们主要对安全性、可恢复性、合规性等进行测试。

    在 AWS 官方提供的镜像构建工具 AMI Builder 中,在镜像构建结束前还会对正在运行的实例进行安全加固和一些自定义测试:
    在这里插入图片描述

具体实践

目录规范

Paker支持多云、多平台,如果你用Paker管理不同云厂商的镜像的话,可以像按照云厂商、操作系统、自定义镜像名称的多级目录去编排文件。

Paker使用的配置文件是Json,现在也支持HCL了,这里还是以Json文件为例。

├── alicloud
│   ├── linux
│   │   └── custom_image_name
│   │       ├── files
│   │       ├── main.json
│   │       ├── scripts
样例说明

Paker使用的配置文件是Json,现在也支持HCL了,这里还是以Json文件为例,使用的例子是Paker Github仓库example下的阿里云的模板。

{
  "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":"packer_test",
    "source_image":"winsvr_64_dtcC_1809_en-us_40G_alibase_20190318.vhd",
    "instance_type":"ecs.n1.tiny",
    "io_optimized":"true",
    "internet_charge_type":"PayByTraffic",
    "image_force_delete":"true",
    "communicator": "winrm",
    "winrm_port": 5985,
    "winrm_username": "Administrator",
    "winrm_password": "Test1234",
    "user_data_file": "examples/alicloud/basic/winrm_enable_userdata.ps1"
  }],
  "provisioners": [{
    "type": "powershell",
    "inline": ["dir c:\\"]
  }]
}

Paker构建文件主要包含三部分:

Variables 定义后续模板需要引用的变量,也是可以根据不同场景去灵活调整的;

Builders 是各云厂商提供的构建器,Paker通过与构建器交互来运行实例并创建镜像;

Provisioners 通常是执行一些初始化脚本,使镜像达到你预期的状态。

推荐的实践
安全加固

由AWS的责任共担模式可知,云厂商并不保证镜像市场上所有镜像的安全性,所以在构建生产用的基础镜像时,预先执行一些安全加固脚本可以在系统层面提供更好的安全性。

安全加固脚本参考开源项目 https://github.com/dev-sec/ansible-os-hardening 和 https://github.com/dev-sec/linux-baseline

前者用于加固,后者用于基线检查,都针对 linux 操作系统

主要进行的加固项如下,可在ansible-os-hardening项目的task目录下查看详情:

  • auditd.yml 安装并配置auditd,用于审计
  • limits.yml 禁止产生coredump
  • login_defs.yml 创建并配置login_defs文件,用于对登录用户的一些属性进行限制
  • minimize_access.yml 限制/etc/passwd, /etc/shadow, 二进制目录等文件系统的访问权限
  • modprobe.yml 禁用部分不常用的文件系统
  • pam.yml 删除密码缓存,加强系统用户的安全认证模块
  • rhosts.yml 禁止用户通过 rhost http-equiv netrc 等方式登录
  • securetty.yml 只允许console和tty类型的终端
  • suid_sgid.yml 禁止一些系统命令的提权权限
  • sysctl.yml 调整sysctl系统内核参数
  • user_accounts.yml 设置第三方应用的系统账户无法通过shell登录
  • yum.yml 删除无用仓库,启用GPG检验

以上模块可以根据实际情况进行裁剪。

数据盘挂载

对数据可用性要求较高的镜像,可以把数据单独存储在数据盘并在实例启动时挂载到相应路径。

例如在阿里云和AWS的Packer main.json 文件中,system_disk_mappinglaunch_block_device_mappings用于设置系统盘初始大小,image_disk_mappingsami_block_device_mappings用于添加多个数据盘,随后可以在 user_data 中写入磁盘的挂载命令,user_data 会在实例启动时执行

      "system_disk_mapping": {
        "disk_category": "cloud_efficiency",
        "disk_size": 50
      },
      "image_disk_mappings": [
        {
          "disk_device": "/dev/sdb",
          "disk_category": "cloud_efficiency",
          "disk_size": 50
        }
      ],
      "user_data": "",
      "user_data_file": ""
      "launch_block_device_mappings": [
        {
          "device_name": "/dev/sda1",
          "volume_size": 50,
          "volume_type": "gp2",
          "delete_on_termination": true
        }
      ],
      "ami_block_device_mappings": [
        {
          "device_name": "/dev/sdb",
          "volume_size": 50,
          "volume_type": "gp2"
        }
      ],
      "user_data": "",
      "user_data_file": ""
最小执行权限

Paker 执行需要云账户的Access Key,在实际构建过程中,推荐单独创建一个子角色,并赋予 Paker构建镜像过程中必要的权限。

AWS的权限参考 packer官方文档,

阿里云的权限如下:

 {
    "Version": "1",
    "Statement": [
        {
            "Action": [
                "ecs:DescribeImages",
                "ecs:CreateImage",
                "ecs:ModifyImageSharePermission",
                "ecs:CreateKeyPair",
                "ecs:DeleteKeyPairs",
                "ecs:DetachKeyPair",
                "ecs:AttachKeyPair",
                "ecs:CreateSecurityGroup",
                "ecs:DeleteSecurityGroup",
                "ecs:AuthorizeSecurityGroupEgress",
                "ecs:AuthorizeSecurityGroup",
                "ecs:CreateSnapshot",
                "ecs:AttachDisk",
                "ecs:DetachDisk",
                "ecs:DescribeDisks",
                "ecs:CreateDisk",
                "ecs:DeleteDisk",
                "ecs:CreateNetworkInterface",
                "ecs:DescribeNetworkInterfaces",
                "ecs:AttachNetworkInterface",
                "ecs:DetachNetworkInterface",
                "ecs:DeleteNetworkInterface",
                "ecs:DescribeInstanceAttribute",
                "ecs:CreateInstance",
                "ecs:DeleteInstance",
                "ecs:StartInstance",
                "ecs:StopInstance",
                "ecs:DescribeInstances",
                "ecs:AddTags",
                "ecs:CopyImage"
            ],
            "Resource": [
                "*"
            ],
            "Effect": "Allow"
        },
        {
            "Action": [
                "vpc:CreateVpc",
                "vpc:DeleteVpc",
                "vpc:DescribeVpcs",
                "vpc:CreateVSwitch",
                "vpc:DeleteVSwitch",
                "vpc:DescribeVSwitches",
                "vpc:AllocateEipAddress",
                "vpc:AssociateEipAddress",
                "vpc:UnassociateEipAddress",
                "vpc:DescribeEipAddresses",
                "vpc:ReleaseEipAddress"
            ],
            "Resource": [
                "*"
            ],
            "Effect": "Allow"
        }

参考

为什么要对自定义镜像做安全加固 —— AWS安全责任共担模型

部署的模式(一):基础设施即代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Paker Unpaker是一种数据传输格式,主要用于将数据在不同系统之间进行传递和解析。它能够实现数据的打包和拆包操作,使得数据能够按照一定的规则进行传输和解析。 在数据传输过程中,数据需要按照特定的格式进行打包,以便在接收端进行解析。Paker Unpaker可以将数据打包成一个统一的格式,并将其传输到接收端。这样一来,无论接收端是什么类型的系统,只要能够正常解析这个格式,就能够正确地接收和处理数据。 另一方面,Paker Unpaker还可以将被打包的数据进行解析和拆包操作。它可以根据打包时设定的格式规则,将打包的数据解析成原始的数据格式,并将其还原为原始数据。这样一来,接收端就可以正确地解析和处理数据,达到良好的数据交互效果。 总的来说,Paker Unpaker是一种数据传输的辅助工具,能够实现数据的打包和解析。通过使用Paker Unpaker,可以简化数据传输和解析的过程,提高数据交互的效率和准确性。 ### 回答2: Paker和Unpaker都是一种数据传输中常用的工具,用于将数据打包(Paker)和解包(Unpaker)。 Paker的主要作用是将多个数据按照一定的格式打包成一个整体,以便于在数据传输或存储过程中进行传递。它可以将不同类型的数据,比如文本、数字、图像等,组织成一个数据块,并添加用于标识和描述的头部信息。通过使用Paker,数据可以更加高效地进行传输和存储,减少数据冗余和传输错误的可能性。 而Unpaker则是与Paker相对的操作,它用于将经过打包的数据进行解包,恢复成原来的格式和结构。通过读取头部信息,Unpaker能够根据预设的规则解析数据块,还原其中的各个部分。这样,接收方就能够正确地处理接收到的数据,并还原成原始数据。 Paker和Unpaker在各种领域都有广泛的应用,特别是在计算机网络和数据通信中。在网络传输中,数据常常需要通过多个节点传递,使用Paker能够将这些数据打包成统一的格式,方便传输和解析。而在接收方,使用Unpaker可以还原数据,并根据需要进行处理和分析。此外,Paker和Unpaker还经常用于数据存储和数据库管理等领域,以便于数据的保存和提取。 总结来说,Paker和Unpaker是一对相互配合的工具,通过将数据打包和解包,能够方便地进行数据传输、存储和处理,提高数据的传输效率和准确性。 ### 回答3: Paker(打包器)和Unpaker(解包器)是两个常用的术语,通常用于描述将信息编码和解码的过程。 打包器(Paker)是指将数据或信息转换为特定格式的过程。在计算机科学中,打包器常用于将多个数据项、文件或消息封装成单个实体,便于传输、存储或处理。打包器能够将具有不同数据类型的数据整合在一起,并为其添加附加信息以确保数据的完整性和准确性。 解包器(Unpaker)则是与打包器相反的过程,即将已打包的数据或信息还原为原始形式。解包器能够准确地从打包后的实体中提取出原始数据,并进行进一步的操作或分析。 这两个术语经常在网络通信、数据传输和编程领域中使用。在网络通信中,数据通常需要打包后传输以提高传输效率和安全性。例如,在网络协议中,数据包通常通过打包器打包为特定的协议格式后再通过网络传输到目标计算机,目标计算机则使用解包器进行解包操作后再将数据进行处理。类似地,在编程中,开发人员也可以使用打包器和解包器来处理和转换数据,以满足不同的需求。 总而言之,打包器和解包器是用于将数据或信息进行编码和解码的工具。打包器可以将多个数据项组合成单个实体,而解包器则可以从打包后的实体中提取出原始数据。这两个过程在网络通信、数据传输和编程中被广泛应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wonain

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值