docker anaconda_使用Docker容器部署Cobbler服务

简介

题图在这里个人觉得很适合(但是放了一个雨靴,本来是要放鞋子),因为鞋子和这里要说的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

cd74ddbac7d07516257cc751df0eb7d7.png

运行镜像

启动容器前我们要先修改配置文件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确认创建的容器已经正常运行

5d6c89ad2015cd7e26dbbd4a98afa89b.png

打开浏览器,确认cobbler_web可以访问,地址为https://YOUR_cobbler_server/cobbler_web, 默认的登录名和密码是cobbler/cobbler

35a26706a2f7f666af11357def98c868.png
Note: 如遇到访问不了,进入容器看一下端口是否正常,firewalld服务是否关闭,你可以用docker exec -it cobbler1.0 /bin/bash

登录后界面看起来是这样的

bb2b4c3b3bcd5c94a932bf8023798b94.png

到这里我们的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加载识别我们的系统镜像。

4b6b73c5f19c7014b6409ea81387937b.png

Prefix可以根据实际系统版本调整,Arch是x86_64,Breed选择Redhat based,Path选择容器内第一个镜像文件的存储位置,配置完成后点击Run,开始导入,导入大概占用30s,根据实际镜像内容大小时间可能会有差异。可根据cobbler提供的日志来检查镜像是否成功上传。

85c5325d3da0cf253379cdf81a1a1e0c.png

出现如上提示说明上传完成,之后点击Configuration模块的Distros,检查刚刚上传的镜像。

开始安装操作系统

有两种安装系统的方法,一种是常规的让客户机接入cobbler所在网络,通过cobbler和DHCP进行安装,这种方式需要手动配置不同系统的KS配置文件,并且需要客户机在cobbler的系统镜像中选择需要的OS才能开始安装。另一种,也是这里要介绍的一种,是通过配置固定的System来进行全自动安装,需要提前获取每个客户机的MAC地址,并在WEB端配置。配置system的方法可以非常方便的调整hostname和IP地址,这种方式能提供更好的自动化体验,并且可以让你定制每一台设备的安装流程,缺点是获取MAC地址是个麻烦事。

以虚拟机环境为例,先获取客户机的MAC地址

3983b21f3070a5f19813a93a6e365317.png

回到cobbler页面中,选择Configuration-Systems,创建新系统

791797fdb08c9088ff99698792986977.png

profile栏选择需要安装的操作系统,Kickstart选择该系统自定义的ks脚本

a7e8872d2b7ff0aca6bc884c1638e364.png

Hostname填入需要创建的hostname名称,Gateway填入网关地址

90561943e0d9d2aaead9a380681296de.png

Add Interface 填入需要创建的接口名称,之后点击Add,MAC address 填入目标系统的MAC地址

Note: 如果MAC和目标真实MAC能对应,则目标客户机就不需要在引导时选择操作系统,相当于一键自动化部署,但若不提供MAC,则客户机启动默认按照第一种手动选择系统的方式开始安装

IP address 填入对应IP,勾选Static,Subnet Mask填入255.255.255.0,Gateway填入网关。这里实际我注意到创建interface这一步是不必要的,因为安装完成后检查客户机,自动部署并没有创建或者是重命名网卡为eth1,相反还是使用的enoXX的网卡。这里我还没有完全搞清楚。

保存后就完成了目标客户机的配置模板创建,可实现该客户机的一键自动部署操作系统。

若选择第一种手动确认操作系统,则客户机启动时会弹出下图所示窗口

fc586cdab486fec5ef2e138a259daf1c.png

移动光标选择目标操作系统后,安装将会基于配置好的ks完成自动安装

下图展示了两种方案安装的操作系统差异

一键自动化安装完成后IP地址和hostname都已经配置

03c2e5719aadd1ff98c3fa3cf7d819e1.png

手动选择操作系统的则按照默认DHCP分配的地址完成了安装

1f68518da18885ea68ce19ca29165da4.png

补充说明

以下内容针对操作过程中产生的各种问题做简要介绍:

1, CentOS7.2环境下docker启动失败

433b6c4dd1a1760b07925a769257a69a.png

因为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组件支持容器
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值