Infrastructure as Code中packer的使用

目录

先普及一下概念,Infrastructure as Code,也就是从代码开始定义整个网络环境、虚机、各种资源等等。

简单说就是在云上用代码来管理一切,无论是vpc、subnetwork、lb、snat、sg、ec2……

非常符合我的胃口,因为就连架构图,都是用 graphviz 来画的。

那么 Infrastructure as Code (IAC) 可以分为以下五个部分:

  • Ad hoc scripts
  • Configuration Management tools
  • Orchestration tools
  • Provisioning tools
  • Server Templating tools

一、Ad hoc scripts

就是用软件对目的主机进行 point to point 操作,用shell或者ansible都可以。推荐ansible。

在 infosys 面试被一个印度老外问到这问题,因为平时根本不用ansible 的 ad hoc 点对点模式,结果被当场问住。现在才知道这玩意是什么。当然,用 ansible 的话不建议用这个,因为 playbook 是可追溯的。

二、Configuration Management tools

配置管理,这里当然推荐 ansible,每一步的操作都可以有 inventory 和 playbook 可以追溯。

三、Orchestration tools

协同工具,k8s和kvm

四、Provisioning tools

生产工具,当然是terraform,另外,阿里云是支持plumi的,华为腾讯不支持。

五、Server Templating tools

模板工具,这里就是 Packer,其实我们公司现在的模板工具,是八戒从openstack学的,改动Cloud-init的东西。

Packer更标准一下,是进化版的东西,它既可以打kvm镜像,也可以打Docker镜像。

下面我们就看看怎么使用吧,这里先说kvm,因为kvm的比较难,docker的八戒现在还是用Dockerfile,有空了再研究packer:

安装就不多说了,就一个执行文件,下载下来就行,不用装。

Packer的核心是三个部分

  • builders
  • provisioners
  • post-processors

我们先建立一个空目录,名字随便,就叫 test-image

1mkdir test-images
2cd test-image

然后在目录下面,建立三个文件:

packer.json, variable.json, setup.sh

首先看variable.json,对应AWS长这样

1{ 
2 	"description": "test image", 
3    "access_key": "enter-aws-your-key", 
4    "secret_key": "enter-aws-your-secret" 
5    "source_ami": "enter-yours" 
6 }

对应腾讯云就是这样

1{
2    "description": "test image",
3    "tc_secret_id": "TENCENTCLOUD_ACCESS_KEY",
4    "tc_secret_key": "TENCENTCLOUD_SECRET_KEY",
5    "source_tc": "enter-yours"
6}

稍微解释一下,无论哪家云,你都需要去申请secret的key,才可以用,然后就是source_ami和source_tc了,这个指镜像的母版

aws的长这样:

image-20220717162342308

腾讯的长这样:

image-20220717162309950

ok,变量都定义好了。

下面是packer.json的正文

aws的这样:

 1{ 
 2	"builders": [ 
 3    	{ 
 4        	"type": "amazon-ebs", 
 5            "access_key": "{{user `access_key` }}", 
 6            "secret_key": "{{user `secret_key` }}", 
 7            "region" : "us-east-1", 
 8            "ami_name" : "myfirstami", 
 9            "source_ami" : "{{user `source_ami` }}", 
10            "instance_type" : "t2.micro", 
11            "ssh_username" : "ec2-user" 
12         } 
13    ], 
14  	"provisioners": [ 
15         { 
16           	"type": "shell", 
17            "script": "setup.sh" 
18         } 
19    ],
20	"post-processors": [ 
21         { 
22          	"type": "manifest", 
23            "output": "out.json" 
24         } 
25    ]
26} 

看见了吧,核心三部分。那么换成腾讯,就长这样

 1{
 2  "builders": [
 3        {
 4            "type": "tencentcloud-cvm",
 5            "secret_id": "{{user `tc_secret_id`}}",
 6            "secret_key": "{{user `tc_secret_key`}}",
 7            "region": "ap-guangzhou",
 8            "zone": "ap-guangzhou-3",
 9            "instance_type": "S2.SMALL1",
10            "disk_type": "CLOUD_PREMIUM",
11            "associate_public_ip_address": true,
12            "image_name": "myfirsttc",
13            "source_image_id": "{{user `source_tc` }}",
14            "ssh_username" : "root"          
15         }
16    ],
17  	"provisioners": [ 
18         { 
19           	"type": "shell", 
20            "script": "setup.sh" 
21         } 
22    ],
23	"post-processors": [ 
24         { 
25          	"type": "manifest", 
26            "output": "out.json" 
27         } 
28    ]
29}

大差不差吧。

详细参数可以去看:https://www.packer.io/plugins/builders/tencentcloud

那最后就是setup.sh了,举例装个jenkins好了,其他的可以根据需要进行注入:

 1sleep 30
 2sudo yum update –y
 3sudo wget -O /etc/yum.repos.d/jenkins.repo \
 4    https://pkg.jenkins.io/redhat-stable/jenkins.repo
 5sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
 6sudo yum upgrade
 7sudo yum instqll -y epel-release
 8sudo yum install java-openjdk11 -y
 9sudo yum install jenkins -y
10sudo systemctl enable jenkins
11sudo systemctl start jenkins
12sudo systemctl status jenkins

最后run一下:

1packer build -var-file="variable.json" packer.json

叽哩咕噜一顿,就build好了

image-20220717170447736

Over,这个工具在IAS中是不可缺少的一环。


Cisco设备自动执行和备份的脚本
一次mongodb Cpu很high的解决方法
comments powered by Disqus