Giter VIP home page Giter VIP logo

installer's Introduction

项目由来

设想一下: 你公司某个节点要建设,进货了200台服务器(不同规格),都是安装同样的系统,区别在于hostname和业务相关的IP以及IPMI(带外的)网络信息。接好所有的线后机柜和网络规划为

                                            +----------------+
                                            |  Corenet-Spine |
                                            |                |
                                            +-------+--------+
                                                    ^
                                                    |
         +---------------------+-------------------------------------------+---------------------+
         |                     ^                    |                      ^                     |
         |                     |                    |                      |                     |
         |                     |                    |                      |                     |
+--------+-------+    +--------+-------+    +-------+--------+    +--------+-------+    +--------+-------+
|    M/C/S-ACC   |    |    M/C/S-ACC   |    |    M/C/S-ACC   |    |    M/C/S-ACC   |    |    M/C/S-ACC   |
|                |    |                |    |                |    |                |    |                |
+----------------+    +----------------+    +----------------+    +----------------+    +----------------+
|     Machine    |    |     Machine    |    |     Machine    |    |     Machine    |    |     Machine    |
+----------------+    +----------------+    +----------------+    +----------------+    +----------------+
|     Machine    |    |     Machine    |    |     Machine    |    |     Machine    |    |     Machine    |
+----------------+    +----------------+    +----------------+    +----------------+    +----------------+
|     Machine    |    |     Machine    |    |     Machine    |    |     Machine    |    |     Machine    |
+----------------+    +----------------+    +----------------+    +----------------+    +----------------+
|     Machine    |    |     Machine    |    |     Machine    |    |     Machine    |    |     Machine    |
+----------------+    +----------------+    +----------------+    +----------------+    +----------------+
|     Machine    |    |     Machine    |    |     Machine    |    |     Machine    |    |     Machine    |
+----------------+    +----------------+    +----------------+    +----------------+    +----------------+
|     Machine    |    |     Machine    |    |     Machine    |    |     Machine    |    |     Machine    |
+----------------+    +----------------+    +----------------+    +----------------+    +----------------+
|     Machine    |    |     Machine    |    |     Machine    |    |     Machine    |    |     Machine    |
+-----------------    ------------------    ------------------    ------------------    -----------------+

每个机柜都有各个网络接入的交换机,考虑到最坏最省钱的情况,由于每台服务器都没有做raid(出场做raid得加服务费)。你得到现场去用笔记本一台台直连服务器的带外口网线设置好带外(IPMI)的ip后(出场配置好指定ip或者配置成DHCP得加服务费),才能在办公室通过带外远程继续操作。重启服务器进bios或者阵列卡里去配置阵列(raid)(服务器厂商没有cli tool来远程配置raid),最后在pxe安装完后所有系统后人为一台台上去改hostname和相关的网络设置。 但是如果所有服务器只需要开机通电,就能达到最终需求呢

目前做到的

上架布好线后,统计服务器的序列号和标签名,整理成一份excel表格(现场的人员统计前两列,后面可以让办公室的人填写),例如

设备名 序列号 hostname IPMI IP MASK GW MG IP MASK GW
HN1-xxx-R4900G3-001 210200A00QH19700xxx1 HN1-XX-ComCVK-001 10.101.0.101 255.255.255.0 10.101.0.254 10.102.0.1 255.255.255.0 10.102.0.254
HN1-xxx-R4900G3-002 210200A00QH19700xxx2 HN1-XX-ComCVK-002 10.101.0.102 255.255.255.0 10.101.0.254 10.102.0.2 255.255.255.0 10.102.0.254
HN1-xxx-R4900G3-003 210200A00QH19700xxx3 HN1-XX-ComCVK-003 10.101.0.103 255.255.255.0 10.101.0.254 10.102.0.3 255.255.255.0 10.102.0.254
HN1-xxx-R4900G3-004 210200A00QH19700xxx4 HN1-XX-ComCVK-004 10.101.0.104 255.255.255.0 10.101.0.254 10.102.0.4 255.255.255.0 10.102.0.254

然后(通过curl命令或者后期开发个前端页面)上传excel到后端,autoInstaller相关进程启动后,交换机配置好pxe需要的DHCP的boot-filename,服务器开机后最终就会按照表格里的设置好,全程不需要人为干预

技术前提需知

前提

总结

  • 修改grub.cfg适应pxe场景以及ks依赖的俩boot option
  • 修改iso的squashfs.img增加阵列卡的cli tool命令,这步不一定,也可以kickstart的%pre阶段下载cli的包安装然后做阵列
  • 编写后端,支持上传excel和根据来源序列号返回渲染是ks文件

实际部署步骤

因为pxe和请求ks的时候都用到了dhcp,所以定义了一个段10.1.0.0/16供安装阶段使用。最终的实际ip和安装段不重合,也就是下面的组网,核心上设置路由都能通,我自己笔记本接核心上设置静态ip:


                              10.1.0.2      +----------------+
                                +---+       |  Corenet-Spine |
                                |pc +------>+                |
                                +---+       +-------+--------+
                                                    ^
                                                    |
         +---------------------+-------------------------------------------+---------------------+
         |                     ^                    |                      ^                     |
         |                     |                    |                      |                     |
         |                     |                    |                      |                     |
+--------+-------+    +--------+-------+    +-------+--------+    +--------+-------+    +--------+-------+
|    M/C/S-ACC   |    |    M/C/S-ACC   |    |    M/C/S-ACC   |    |    M/C/S-ACC   |    |    M/C/S-ACC   |
|                |    |                |    |                |    |                |    |                |
+----------------+    +----------------+    +----------------+    +----------------+    +----------------+
|     Machine    |    |     Machine    |    |     Machine    |    |     Machine    |    |     Machine    |
+----------------+    +----------------+    +----------------+    +----------------+    +----------------+
|     Machine    |    |     Machine    |    |     Machine    |    |     Machine    |    |     Machine    |
+----------------+    +----------------+    +----------------+    +----------------+    +----------------+
|     Machine    |    |     Machine    |    |     Machine    |    |     Machine    |    |     Machine    |
+----------------+    +----------------+    +----------------+    +----------------+    +----------------+
|     Machine    |    |     Machine    |    |     Machine    |    |     Machine    |    |     Machine    |
+----------------+    +----------------+    +----------------+    +----------------+    +----------------+
|     Machine    |    |     Machine    |    |     Machine    |    |     Machine    |    |     Machine    |
+----------------+    +----------------+    +----------------+    +----------------+    +----------------+
|     Machine    |    |     Machine    |    |     Machine    |    |     Machine    |    |     Machine    |
+----------------+    +----------------+    +----------------+    +----------------+    +----------------+
|     Machine    |    |     Machine    |    |     Machine    |    |     Machine    |    |     Machine    |
+-----------------    ------------------    ------------------    ------------------    -----------------+
    10.1.1.0/24           10.1.2.0/24           10.1.3.0/24           10.1.4.0/24           10.1.5.0/24

一个机柜是一个最小单位,所以一个机柜一个段

实操部署步骤:

准备docker环境

准备一台centos7.6+系统,有条件单独机器也行,我是笔记本虚机桥接网口,笔记本网口接核心上

编译Installer

准备go

安装go,建议1.13以上版本,从官网获取下载直链,当然懂容器的话可以容器编译,这里是在Linux上非容器编译

VERSION=1.14.2
OS=linux
ARCH=amd64
wget https://dl.google.com/go/go$VERSION.$OS-$ARCH.tar.gz #下载多半需要梯子
tar -C /usr/local -xzf go$VERSION.$OS-$ARCH.tar.gz
# 配置环境变量
cat <<'EOF'>> ~/.bashrc
export PATH=$PATH:/usr/local/go/bin
export GO111MODULE=on
export GOPROXY=https://goproxy.cn,https://mirrors.aliyun.com/goproxy/,https://goproxy.io,direct
export CGO_ENABLED=0
EOF
. ~/.bashrc

执行go version有输出则往下走

编译
git clone https://github.com/zhangguanzhang/Installer.git  #下载文件

我们这标准都是八张网卡,所以代码里也是八张的逻辑,为了避免少于8张网卡会触发我代码的panic。所以我代码目前是只留一个网卡的逻辑,自行按照自己实际去取消代码api/v1/ks.go里的41-54行的注释,我代码里录入mac地址是为了以后的cmdb,所以mac这部分录入不是那么重要。例如你两批机器分别是6张和8张网卡,你可以留到nic6的部分就行了。

cd Installer
go build -o docker/Installer main.go # 编译可执行文件到docker目录下

准备相关文件

准备镜像相关文件

准备目录,先进入docker目录

cd docker
mkdir -p http/centos tftp mysql http/soft

启动mysql,tftp,nginx

docker-compose up -d

准备pxe启动文件,系统先把安装的iso挂载了

  • cp -a复制centos iso的EFI/BOOT/下文件到上面的tftp/目录
  • 把iso解压到http/centos/目录下,复制iso里/images/pxeboot/vmlinuzinitrd.img到tftp目录里
  • 如果你不想改iso的话可以在http/soft/下放入安装过程中下载和安装运行做硬raid的命令的安装包啥的
  • 更改grub.cfg(tftp里的grub.cfg.tmpl文件可参考),里面的ip和你实际的pc部署ip要一致,因为安装阶段下载文件是nginx提供的,http/centos/是放centos iso解开的文件,8080是installer,所以是
inst.repo=http://10.1.0.2/centos ks=http://10.1.0.2:8080/api/v1/ks

不要加参数ksdevice=xxx指定ks请求指定网卡,除非你明确现场连线正确,centos7是会去尝试每张网卡的

kickstart部分

kickstart部分自己按照自己的实际写,分区,密码(ks的密码可以用cd scripts里运行python2.7 grub-crypt.py --sha-512生成)啥的。可以参考文档 https://fedoraproject.org/wiki/Anaconda/Kickstart/zh-cn 特别是ipmi(也就是bmc)的网络和阵列要自己去测试下,如果阵列的cli没做到iso里这里可以wget cli的包安装然后做阵列,例如把阵列的cli放http/soft下,然后%pre阶段从nginx下载安装

%pre
wget http://10.1.0.2/soft/xxx
chmod u+x xxx
xxx 创建阵列
...
...
%end

ks-mini.tmpl文件是大概的列出了下模板的变量和基础设置,两个文件都参考下 编辑kickstart文件记得dos2unix它,可能windows下编辑有回车

启动Installer
./Installer -ks=template/ks.tmpl # 指定你自己的ks文件

然后再打开个终端进入docker目录往下继续,Installer提供的http接口看文件docs/api.md文件

上传excel文件导入数据库

准备填写好excel文件后,scripts目录里有脚本,参照machines.xlsx的列要求写好这个excel(列的作用是在代码里的常量固定的),然后用脚本upload.sh去curl模拟http上传excel到我后端(url的path为localhost:8080/api/v1/ks POST请求),后端会把excel信息导入到mysql里,例如上传excel文件conf.xlsx

curl -X POST localhost:8080/api/v1/upload   \
  -H "Content-Type: multipart/form-data"  \
  -F "[email protected]"  

然后进入mysql查看表

# 密码是docker-compose里,默认zhangguanzhang
docker exec -ti pxe_mysql mysql -u root -p
> use pxe;
> select * from machines;

表信息都有了的话看下Installer运行界面有错误信息没,没就往后继续走,有的话多半是值的长度(例如序列号规定是21,你22位了)或者例如ip或者唯一值的列有值重复了。可以把mysql的machine表内容清空了改好excel后再上传

利用curl模拟机器请求kickstart文件

scripts目录里有个header.sh脚本,自己改下序列号模拟下真实的kickstart请求,看下返回的ks内容是否渲染了机器唯一的信息

配置dhcp

这个看自己的组网情况,如果你是全部都在一个设备下面,可以自己起一个软dhcp server,我这里是交换机起dhcp server,现场每个机柜交换机都配置好后dhcp和pxe部分,bootfile和next-server要写对

[H3C-S5130-dhcp-pool-1] bootfile-name BOOTX64.EFI
[H3C-S5130-dhcp-pool-1] next-server 10.1.0.2
[H3C-S5130-dhcp-pool-1] tftp-server ip-address 10.1.0.2

因为我pc是10.1.0.0/24,得写个安装段16的路由

  • Installer机器配置好ip为10.1.0.2, 并配置10.1.0.0/16的路由route add -net 10.1.0.0/16 gw 10.1.0.254 dev ens37,我pc是虚拟机桥接,根据自己情况去配置
  • 所有物理机开机即可,不熟悉的话可以先一台物理机测试下,可行了后续基本就都固化了

可扩展的设想

  • 目前的dhcp是在交换机上,可以开发dhcp server,因为ipmi出场是固定ip的,有些服务器厂商的mac地址贴在机器表面了,可以根据mac地址返回不同的boot-filename
  • 同样的,可以用tftp server根据请求grub.cfg时候第一次请求的是自身mac地址,可以提前导入mac地址去渲染返回不同的grub.cfg从而安装不同的操作系统

installer's People

Contributors

dependabot[bot] avatar zhangguanzhang avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

installer's Issues

./Installer -ks=template/ks.tmpl ERROR

./Installer -ks=template/ks.tmpl ERROR
FATA[0000] kickstart template file template/ks.tmpl stat template/ks.tmpl: no such file or directory

Anyone know how to fix this?
In Dir, all files are there

这个项目是不支持安装Ubuntu系统嘛?

我做过尝试安装ubuntu失败了. 作者是否可以开发一个兼容安装Ubuntu系统和提供web界面的新功能呢? 做到批量自动配置raid然后批量自动安装ubuntu系统和centos系统? 目前这个安装centos系统是可以的。但是安装ubuntu系统失败了.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.