简介
题图在这里个人觉得很适合(但是放了一个雨靴,本来是要放鞋子),因为鞋子和这里要说的cobbler,docker等都没有太强的联系性,除了cobbler有补鞋匠的意思之外,实在找不到线索可以联系起来了orz..
不过说实在的,cobbler将Linux的部署变得很简单并且快捷,非常适合运维人员对大量新设备进行批量安装的操作,而且也支持绑定mac地址进行无人值守的自动化安装,可以说是非常方便了。
Cobbler是基于Python语言编写的批量引导平台,其特点在于可以支持不同的系统镜像,同时基于pxe网络引导执行自动化系统安装。本文档制作意在指导操作者使用容器技术搭建易用和快速部署的Cobbler服务。 要顺利使用此文档,请提前参阅了解docker技术,kickstart技术和PXE网络引导。 有意思的是,百度百科将cobbler介绍为:Cobbler 可以用来快速建立 Linux 网络安装环境,它已将 Linux 网络安装的技术门槛,从大专以上文化水平,成功降低到初中以下,连补鞋匠都能学会。
Note: 不过我在后期的实际使用中发现,docker容器部署的方式在没有简化image的情况下,易用性不如直接安装服务好。这里给自己留个坑,一是在此版本的部署基础上继续优化镜像大小,二是继续调整容器部署方式。
其实我本人做这个事的目的是刚好练一下手,去再熟悉一下docker容器,敲定了思路以后在网上去找了一些资料,文章最后我会把参考资料也附上。
准备
首先你得先安装docker,在你本地先执行
yum -y install epel-release vim net-tools docker
我测试的时候使用的最小化安装所以额外还装了一些工具,主要的还是docker。
安装好了以后先启动docker, 我在使用centos7.2的时候在这一步遇到了报错:
Error starting daemon: SELinux is not supported with the overlay2 graph driver on this kernel. Either boot into a newer kernel or disable selinux in docker (--selinux-enabled=false)
就是说你本机的SELinux和overlay2存储驱动不兼容,我这里是直接换了driver layer,换成了CentOS能支持的devicemapper
vim /etc/sysconfyg/docker-storage
DOCKER_STORAGE_OPTIONS="--storage-driver devicemapper"
Note: 容器默认的大小为10G,所以一般不修改的情况下这个cobbler容器只能加载1-2个最小化镜像,若有超过5G的ISO文件导入,则容器会因空间不足而不支持导入操作,所以如果需要安装的ISO体量较大,可以在此处添加--storage-opt dm.basesize=40G,将容器的大小调整成40G以支持更多更大的镜像。如果在修改空间前已经启动过docker,需要rm -rf /var/lib/docker目录后重启docker以便让新配置生效。 ---所以当时的头脑一热还是给自己挖了很多坑啊...
建立镜像
dockers启动以后我们就可以开始建立镜像了。这个文档一并把建立docker镜像的步骤也包含了,所以你会在下面看到我使用的dockerfile,这个dockerfile很大程度上参考了国外一位技术人员的博文。
FROM centos:7.2.1511
MAINTAINER rex657
RUN yum -y install epel-release vim net-tools
RUN yum -y install httpd tftp cobbler cobbler-web dhcp xinetd syslinux pykickstart bind && yum clean all
RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in *;
do [ $i == systemd-tmpfiles-setup.service ] || rm -f $i; done);
rm -f /lib/systemd/system/multi-user.target.wants/*;
rm -f /etc/systemd/system/*.wants/*;
rm -f /lib/systemd/system/local-fs.target.wants/*;
rm -f /lib/systemd/system/sockets.target.wants/*udev*;
rm -f /lib/systemd/system/sockets.target.wants/*initctl*;
rm -f /lib/systemd/system/basic.target.wants/*;
rm -f /lib/systemd/system/anaconda.target.wants/*;
VOLUME [ "/sys/fs/cgroup" ]
RUN systemctl enable cobblerd;systemctl enable httpd;systemctl enable dhcpd
RUN sed -i -e 's/(^.*disable.*=) yes/1 no/' /etc/xinetd.d/tftp
RUN touch /etc/xinetd.d/rsync
EXPOSE 69
EXPOSE 80
EXPOSE 443
EXPOSE 25151
CMD ["/sbin/init"]
随着我后来对docker技术的理解加深,我发现使用我这个dockerfile也存在很多不足,比如直接引入了系统镜像而不是只引进必需的文件,对cobbler组件使用的其他角色没有分离,而是直接都塞到一个容器里,这些都是我以后要修正的方向。但现在让我们先用这个dockerfile直接开始部署镜像吧。
docker build . -t cobbler:1.0
Note: 需要注意的点
1, 可能需要改一下docker的源,因为默认使用的国外源比较慢
2, build的时候路径下不要有不相关的文件,因为build会把当前路径下的所有文件都加载进去,造成build很慢
Build正常完成以后你应该能够使用下面的命令查看刚刚建好的镜像。
docker images
运行镜像
启动容器前我们要先修改配置文件settings和dhcp.template,下文的192.168.101.100为docker宿主机的IP地址。
settings文件中需要修改的内容为:
server: 192.168.101.100 #cobbler的服务器地址
next_server: 192.168.101.100 #tftp服务器地址
manage_dhcp: 1 #dhcpg管理设置为1,启用dhcp
dhcp.template文件中需要修改的内容为:
subnet 192.168.101.0 netmask 255.255.255.0 { #修改网段
option routers 192.168.101.254; #指定网关
option domain-name-servers 192.168.101.100; #指定dns
option subnet-mask 255.255.255.0; #指定子网掩码
range dynamic-bootp 192.168.101.100 192.168.101.150; #指定地址池
修改完成后保存文件,并使用如下命令启动容器:
docker run
-d
--privileged
--net host
-v /sys/fs/cgroup:/sys/fs/cgroup:ro
-v /etc/selinux:/etc/selinux
-v /opt/settings:/etc/cobbler/settings
-v /opt/dhcp.template:/etc/cobbler/dhcp.template
-p 69:69
-p 80:80
-p 443:443
-p 25151:25151
--name cobbler1.0 cobbler:1.0
之后使用命令docker ps -a
确认创建的容器已经正常运行
打开浏览器,确认cobbler_web可以访问,地址为https://YOUR_cobbler_server/cobbler_web, 默认的登录名和密码是cobbler/cobbler
Note: 如遇到访问不了,进入容器看一下端口是否正常,firewalld服务是否关闭,你可以用docker exec -it cobbler1.0 /bin/bash
登录后界面看起来是这样的
到这里我们的cobbler容器就正常启动并可以工作了,我们可以接下来继续往我们的cobbler服务器添加镜像。我之前尝试在添加了系统安装镜像之后打包出来一个docker镜像,后来发现镜像太大不好使用,直接违背了便携的初衷,只好作罢。
上传系统ISO镜像
这里你需要:
指定并创建容器的镜像存储路径,比如我用的/opt/iso001,就需要进入容器后执行mkdir /opt/iso001,mkdir /opt/iso002(因为我有两个镜像,不同的centOS版本)
宿主机创建路径并挂载镜像,我同样使用的是/opt目录,mkdir /opt/media,之后就是挂载mount /dev/cdrom /opt/media
使用命令docker cp /opt/media cobbler1.0:/opt/iso001
将本地的镜像挂载点复制到容器中,或者你也可以先挂载,在容器启动的时候再用-v把挂载点提供给container使用。添加完镜像后,我们操作cobbler加载识别我们的系统镜像。
Prefix可以根据实际系统版本调整,Arch是x86_64,Breed选择Redhat based,Path选择容器内第一个镜像文件的存储位置,配置完成后点击Run,开始导入,导入大概占用30s,根据实际镜像内容大小时间可能会有差异。可根据cobbler提供的日志来检查镜像是否成功上传。
出现如上提示说明上传完成,之后点击Configuration模块的Distros,检查刚刚上传的镜像。
开始安装操作系统
有两种安装系统的方法,一种是常规的让客户机接入cobbler所在网络,通过cobbler和DHCP进行安装,这种方式需要手动配置不同系统的KS配置文件,并且需要客户机在cobbler的系统镜像中选择需要的OS才能开始安装。另一种,也是这里要介绍的一种,是通过配置固定的System来进行全自动安装,需要提前获取每个客户机的MAC地址,并在WEB端配置。配置system的方法可以非常方便的调整hostname和IP地址,这种方式能提供更好的自动化体验,并且可以让你定制每一台设备的安装流程,缺点是获取MAC地址是个麻烦事。
以虚拟机环境为例,先获取客户机的MAC地址
回到cobbler页面中,选择Configuration-Systems,创建新系统
profile栏选择需要安装的操作系统,Kickstart选择该系统自定义的ks脚本
Hostname填入需要创建的hostname名称,Gateway填入网关地址
Add Interface 填入需要创建的接口名称,之后点击Add,MAC address 填入目标系统的MAC地址
Note: 如果MAC和目标真实MAC能对应,则目标客户机就不需要在引导时选择操作系统,相当于一键自动化部署,但若不提供MAC,则客户机启动默认按照第一种手动选择系统的方式开始安装
IP address 填入对应IP,勾选Static,Subnet Mask填入255.255.255.0,Gateway填入网关。这里实际我注意到创建interface这一步是不必要的,因为安装完成后检查客户机,自动部署并没有创建或者是重命名网卡为eth1,相反还是使用的enoXX的网卡。这里我还没有完全搞清楚。
保存后就完成了目标客户机的配置模板创建,可实现该客户机的一键自动部署操作系统。
若选择第一种手动确认操作系统,则客户机启动时会弹出下图所示窗口
移动光标选择目标操作系统后,安装将会基于配置好的ks完成自动安装
下图展示了两种方案安装的操作系统差异
一键自动化安装完成后IP地址和hostname都已经配置
手动选择操作系统的则按照默认DHCP分配的地址完成了安装
补充说明
以下内容针对操作过程中产生的各种问题做简要介绍:
1, CentOS7.2环境下docker启动失败
因为centos7.2的内核不支持overlay2,我们需要选择deivcemapper来进行启动,修改方法在开头已经做了介绍
2, 容器未启动
可能是已经有同样名字的容器在运行,具体根据启动时的报错排查
3, 容器启动成功但服务启动失败
借助命令docker exec -it cobbler1.0 /bin/bash进入容器执行一系列的诊断命令判断是哪些服务启动异常,容器自带net-tools工具帮助诊断问题
cobbler依赖于以下服务运行:
httpd 运行在80和443端口
rsyncd 运行在253端口
tftp 运行在69端口
cobblerd 运行在25151端口
如果有服务未正常启动,需要使用systemctl命令启动服务,service命令在容器中无法正常使用。
参考资料
https:// blog.container-solutions.com /cobbler-in-a-docker-container Cobbler in a docker Container,这篇文章作者说的非常详细,我引用了很大一部分。 https:// blog.51cto.com/qingwa/2 129931 用docker快速部署cobbler, 这篇文章的作者还使用了kubelet组件支持容器