云上DevOps-CodePipeline,Packer和Terraform集成实践探索

本文涉及的产品
对象存储 OSS,20GB 3个月
公网NAT网关,每月750个小时 15CU
对象存储 OSS,内容安全 1000次 1年
简介: DevOps越来越火,各种产品层出不穷,技术人员如果不谈谈这个词,就会显得很落伍了,在这种形势下,阿里云也推出了自己的DevOps公共云产品CodePipeline,本文并不想介绍已经铺天盖地的DevOps概念,而是结合阿里云的产品CodePipeline和开源工具Packer,Terraform来实践一种全新云上的DevOps方案,从构建代码,创建自定义镜像,然后基于包含新应用的镜像来创建运行应用的整个基础设施,包括ECS,VPC网络,安全组等等,然后发布应用,从无到有一键完成。

1.简介

        DevOps越来越火,各种产品层出不穷,技术人员如果不谈谈这个词,就会显得很落伍了,在这种形势下,阿里云也推出了自己的DevOps公共云产品CodePipeline,本文并不想介绍已经铺天盖地的DevOps概念,而是结合阿里云的产品CodePipeline和开源工具Packer,Terraform来实践一种全新云上的DevOps方案,从构建代码,创建自定义镜像,然后基于包含新应用的镜像来创建运行应用的整个基础设施,包括ECS,VPC网络,安全组等等,然后发布应用,从无到有一键完成。下面我们以CodePipeline示例Web项目为实例来实践整个方案。

2.开通CodePipeline

2.1登录阿里云控制如后,通过如下导航找到CodePipeline。

image.png

2.2点击图中菜单按钮来到服务开通页面,

image

点击开通服务按钮,由于当前产品处于公测期,开通服务前需要申请,按照要求提交申请,后台人员审核后,出现CodePipeline的产品主界面,就可以开始使用CodePipeline了。

3.创建项目和运行项目

3.1登录阿里云控制台后,通过菜单导航到CodePipeline后,出现如下界面。

image

3.2点击新建按键,来到创建项目导航页面。

输入项目名称Cloud_DevOps,并选择Java项目,点击下一步,
image

3.3来到代码配置构建页面,

在“仓库地址”中输入如下代码,这是一个普通的Java Web示例项目,可以通过Git Clone后查看其内容

https://code.aliyun.com/CodePipeline/java-demo.git

然后在构“建命令中”输入如下命令后结果如下图

 mvn package -DskipTests 
 export ALICLOUD_ACCESS_KEY=<你的阿里云AK_KEY>
 export ALICLOUD_SECRET_KEY=<你的阿里云AK_SECRET_KEY>
 wget http://alideployclient.oss-cn-beijing.aliyuncs.com/packer
 wget http://alideployclient.oss-cn-beijing.aliyuncs.com/demo.json
 chmod 755 packer
 ./packer build demo.json
 wget http://alideployclient.oss-cn-beijing.aliyuncs.com/terraform
 wget http://alideployclient.oss-cn-beijing.aliyuncs.com/main.tf
 wget http://alideployclient.oss-cn-beijing.aliyuncs.com/variables.tf
 chmod 755 terraform
./terraform apply .

image
点击“下一步”,来到部署页面,选择“不部署”,点击“下一步”,在项目确定页面点击“确定”创建项目后来到项目构建页面,点击“立即构建”按钮来运行项目。

image

大约20多分钟后,整个项目运行完成,我们可以通过点击“构建历史”下面的构建号例如“#3”构建日志来查看所生成的ECS的IP和访问端口
image
然后在浏览器中输入

http://47.93.214.116/demo/

就可以看到我们的应用可以访问了。

image

4.原理分析

通过上面简单的几条命令,我们就在阿里云的环境上,编译好了我们的示例应用,并且生成了阿里云的自定义镜像,然后生成了运行应用所必须的基础环境,包括ECS,VPC,端口映射等,使得我们可以一键完成从零到可以访问的应用。这个功能包含三个关键的组件

4.1 CodePipeline

        DevOps阿里云CodePipeline是兼容Jenkins标准的、提供快速可靠的持续集成与持续交付服务。基于容器技术和阿里云基础服务架构,提供稳定和安全的代码/Docker编译构建,测试,扫描和部署的工具服务,并提供Pipeline As Code的编码级配置模式,满足应用程序和基础设施快速可靠的交付和更新。在本实例中,起到任务管理和调用命令执行的功能,它负责构建的容器资源,然后根据项目的配置从Github上将源代码下载构建的容器中,执行构建命令,并调用packer来创建包含所构建应用的阿里云镜像,调用Terraform来创建整个ECS,VPC网络,设置端口映射等全部基础设施。

4.2 Packer

        DevOpsPacker是HashiCorp公司出品的一个从单一的模板文件来创建多平台一致性镜像的轻量级开源工具,它能够运行在常用的主流操作系统如Windows、Linux和Mac os上,能够高效的并行创建多平台例如AWS、Azure和Alicloud的镜像,它的目的并不是取代Puppet/Chef等配置管理工具,实际上,当制作镜像的时候,Packer可以使用Chef或者Puppet等工具来安装镜像所需要的软件。通过Packer自动化的创建各种平台的镜像是非常容易的。关于更多的packer的知识,请访问Pakcer的官网或者阿里云Packer官方插件站点

在构建命令中的下面部分是packer相关的,运行packer首先需要在环境变量或者模板文件中导出阿里云的AK信息,然后下载packer程序和packer模板文件,执行packer命令,packer就会根据模板文件的内容来构建了里云镜像。

export ALICLOUD_ACCESS_KEY=<你的阿里云AK_KEY>
export ALICLOUD_SECRET_KEY=<你的阿里云AK_SECRET_KEY>
wget http://alideployclient.oss-cn-beijing.aliyuncs.com/packer
wget http://alideployclient.oss-cn-beijing.aliyuncs.com/demo.json
chmod 755 packer
./packer build demo.json

下面就是demo.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/" 
       }]
}                   

其中关键是Provisioners部分,它会安装运行应用所需要的软件,并将构建的应用demo.war包含进创建的镜像。

4.3 Terraform

        DevOpsTerraform是HashiCorp公司出品的,著名Vagrant、Packer工具也出自于该公司。Terraform是“基础设施即代码”的开源工具,通过模板定义“基础设施”,目前已支持AWS、Azure、OpenStack、Alicloud等主流云平台。更多的关于Terraform的知识,请访问Terraform官网或者阿里云的Teffaform插件站点

构建命令中的如下命令是Terraform相关的。它也需要先设置AK,然后下载terraform命令和模板文件,然后应用模板文件,就会根据模板文件内容来创建整个基础设施。

 wget http://alideployclient.oss-cn-beijing.aliyuncs.com/terraform
 wget http://alideployclient.oss-cn-beijing.aliyuncs.com/main.tf
 wget http://alideployclient.oss-cn-beijing.aliyuncs.com/variables.tf
 chmod 755 terraform
./terraform apply .

下面就是main.tf的内容:

provider "alicloud" {
    region = "cn-beijing"
}

data "alicloud_instance_types" "1c2g" {
    cpu_core_count = 1
    memory_size = 2
}

data "alicloud_zones" "default" {
    "available_instance_type"= "${data.alicloud_instance_types.1c2g.instance_types.1.id}"
    "available_disk_category"= "${var.disk_category}"
}

resource "alicloud_vpc" "default" {
    name = "pipeline_vpc"
    cidr_block = "${var.vpc_cidr}"
}

resource "alicloud_vswitch" "default" {
    vpc_id = "${alicloud_vpc.default.id}"
    cidr_block = "${var.vswitch_cidr}"
    availability_zone = "${data.alicloud_zones.default.zones.0.id}"
}

resource "alicloud_nat_gateway" "default" {
    vpc_id = "${alicloud_vpc.default.id}"
    spec = "Small"
    name = "bosh_micro_nat"
    bandwidth_packages = [{
        ip_count = 2
        bandwidth = 5
        zone = "${data.alicloud_zones.default.zones.0.id}"
    }]
    depends_on = [
        "alicloud_vswitch.default"]
}
resource "alicloud_snat_entry" "default"{
    snat_table_id = "${alicloud_nat_gateway.default.snat_table_ids}"
    source_vswitch_id = "${alicloud_vswitch.default.id}"
    snat_ip = "${element(split(",", alicloud_nat_gateway.default.bandwidth_packages.0.public_ip_addresses),0)}"
}

resource "alicloud_forward_entry" "default"{
    forward_table_id = "${alicloud_nat_gateway.default.forward_table_ids}"
    external_ip = "${element(split(",", alicloud_nat_gateway.default.bandwidth_packages.0.public_ip_addresses),1)}"
    external_port = "80"
    ip_protocol = "tcp"
    internal_ip = "${alicloud_instance.default.private_ip}"
    internal_port = "8080"
}

resource "alicloud_forward_entry" "ssh"{
    forward_table_id = "${alicloud_nat_gateway.default.forward_table_ids}"
    external_ip = "${element(split(",", alicloud_nat_gateway.default.bandwidth_packages.0.public_ip_addresses),1)}"
    external_port = "22"
    ip_protocol = "tcp"
    internal_ip = "${alicloud_instance.default.private_ip}"
    internal_port = "22"
}

resource "alicloud_security_group" "sg" {
    name = "bosh_micro_sg"
    description = "tf_sg"
    vpc_id = "${alicloud_vpc.default.id}"
}

resource "alicloud_security_group_rule" "http-in" {
    type = "ingress"
    ip_protocol = "tcp"
    nic_type = "intranet"
    policy = "accept"
    port_range = "80/80"
    priority = 1
    security_group_id = "${alicloud_security_group.sg.id}"
    cidr_ip = "0.0.0.0/0"
}

resource "alicloud_security_group_rule" "tomcat-in" {
    type = "ingress"
    ip_protocol = "tcp"
    nic_type = "intranet"
    policy = "accept"
    port_range = "8080/8080"
    priority = 1
    security_group_id = "${alicloud_security_group.sg.id}"
    cidr_ip = "0.0.0.0/0"
}

resource "alicloud_security_group_rule" "ssh" {
    type = "ingress"
    ip_protocol = "tcp"
    nic_type = "intranet"
    policy = "accept"
    port_range = "22/22"
    priority = 1
    security_group_id = "${alicloud_security_group.sg.id}"
    cidr_ip = "0.0.0.0/0"
}


resource "alicloud_security_group_rule" "codepipeline_deploy" {
    type = "egress"
    ip_protocol = "tcp"
    nic_type = "intranet"
    policy = "accept"
    port_range = "4505/4506"
    priority = 1
    security_group_id = "${alicloud_security_group.sg.id}"
    cidr_ip = "0.0.0.0/0"
}

resource "alicloud_security_group_rule" "codepipeline_deploy_ingress" {
    type = "ingress"
    ip_protocol = "tcp"
    nic_type = "intranet"
    policy = "accept"
    port_range = "4505/4506"
    priority = 1
    security_group_id = "${alicloud_security_group.sg.id}"
    cidr_ip = "0.0.0.0/0"
}


resource "alicloud_instance" "default" {
    availability_zone = "${data.alicloud_zones.default.zones.0.id}"
    security_groups = ["${alicloud_security_group.sg.id}"]

    vswitch_id = "${alicloud_vswitch.default.id}"

    password = "${var.ecs_password}"

    # series II
    instance_charge_type = "PostPaid"
    instance_type = "${data.alicloud_instance_types.1c2g.instance_types.1.id}"
    internet_max_bandwidth_out = 0
    io_optimized = "${var.io_optimized}"

    system_disk_category = "cloud_efficiency"
    image_id = "${data.alicloud_images.multi_image.images.0.id}"
    instance_name = "pipeline_ubuntu_1604_64"
}


data "alicloud_images" "multi_image" {
  owners     = "self"
  name_regex = "codepipe_demo"
}

下面是variables.tf的内容,这一部分是定义Terraform模板所需要的变量:

variable "vpc_cidr" {
  default = "10.1.0.0/21"
}
variable "vswitch_cidr" {
  default = "10.1.1.0/24"
}
variable "rule_policy" {
  default = "accept"
}
variable "instance_type" {
  default = "ecs.n1.small"
}
variable "io_optimized" {
  default = "optimized"
}
variable "disk_category"{
  default = "cloud_efficiency"
}
variable "ecs_password"{
  default = "Test12345"
}

在main.tf模板中,通过如下部分来引用上一步packer创建的镜像。

data "alicloud_images" "multi_image" {
  owners     = "self"
  name_regex = "codepipe_demo"
}

5.展望

        DevOps本文是对云上DevOps的一种探索,希望让读者能够意识到相对于传统的环境下的DevOps,云上环境能够提供许多传统环境下不能提供的能力,起到一个抛砖引玉的作用。从CodePipeline这个产品来说,接下来我们会针对用户的场景来深度的集成Packer,Terraform,使其能够更加符合云上DevOps的特点,也欢迎广大的读者提出自己的应用场景和需求,来共同探讨云上DevOps的最佳实践。

相关实践学习
2分钟自动化部署人生模拟器
本场景将带你借助云效流水线Flow实现人生模拟器小游戏的自动化部署
7天玩转云服务器
云服务器ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,可降低 IT 成本,提升运维效率。本课程手把手带你了解ECS、掌握基本操作、动手实操快照管理、镜像管理等。了解产品详情:&nbsp;https://www.aliyun.com/product/ecs
目录
相关文章
|
18天前
|
机器学习/深度学习 人工智能 jenkins
软件测试中的自动化与持续集成实践
在快速迭代的软件开发过程中,自动化测试和持续集成(CI)是确保代码质量和加速产品上市的关键。本文探讨了自动化测试的重要性、常见的自动化测试工具以及如何将自动化测试整合到持续集成流程中,以提高软件测试的效率和可靠性。通过案例分析,展示了自动化测试和持续集成在实际项目中的应用效果,并提供了实施建议。
|
11天前
|
监控 安全 Devops
DevOps实践中,如何平衡开发速度和安全审核的效率
在DevOps实践中,为平衡开发速度与安全审核效率,可采取自动化安全测试、安全编码实践、持续监控与日志分析、集成安全工具、合规性代码审查、基础设施即代码、权限和访问控制、安全培训、漏洞及补丁管理和持续反馈改进等措施,确保高效安全的开发流程。
|
17天前
|
Devops jenkins 测试技术
DevOps实践:自动化部署与持续集成的融合之旅
【10月更文挑战第41天】在软件开发的世界中,快速迭代和高效交付是企业竞争力的关键。本文将带你走进DevOps的核心实践——自动化部署与持续集成,揭示如何通过它们提升开发流程的效率与质量。我们将从DevOps的基本理念出发,逐步深入到具体的技术实现,最终展示一个实际的代码示例,让理论与实践相结合,为你的开发旅程提供清晰的指引。
28 4
|
21天前
|
运维 安全 Devops
DevOps实践中的安全审核和合规性
DevOps实践中的安全审核和合规性
|
21天前
|
监控 安全 Devops
DevOps实践中,如何平衡开发速度和安全审核的效率?
DevOps实践中,如何平衡开发速度和安全审核的效率?
|
23天前
|
存储 监控 Devops
DevOps实践:持续集成/持续部署(CI/CD)的实战指南
DevOps实践:持续集成/持续部署(CI/CD)的实战指南
|
24天前
|
运维 安全 Devops
DevOps实践中的安全审核和合规性
DevOps实践中的安全审核和合规性
|
26天前
|
运维 Devops jenkins
DevOps实践之持续集成与持续交付
【10月更文挑战第32天】在软件开发的快节奏世界中,DevOps已经成为提升效率和质量的关键策略。通过将开发(Development)和运维(Operations)紧密结合,DevOps促进了更快速的软件发布和更高的可靠性。本文将深入探讨DevOps的核心组成部分——持续集成(CI)和持续交付(CD),并展示如何通过实际代码示例实现它们,以帮助团队构建更加高效和稳定的软件发布流程。
|
4月前
|
敏捷开发 缓存 前端开发
阿里云云效产品使用合集之前端打包时npm安装卡住一般是什么导致的
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
4月前
|
敏捷开发 弹性计算 持续交付
阿里云云效产品使用合集之同一个主机部署是否支持下载多个制品
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。

推荐镜像

更多