1、搭建一套自动以运维工具Cobbler系统;

一、PXE 简述及介绍

预启动执行环境(Preboot eXecution Environment,PXE,也被称为预执行环境)是让计算机通过网卡独立地使用数据设备(如硬盘)或者安装操作系统。PXE当初是作为Intel的有线管理体系的一部分,Intel和 Systemsoft于1999年9月20日公布其规格(版本2.1)。通过使用像网际协议(IP)、用户数据报协议(UDP)、动态主机设定协定(DHCP)、小型文件传输协议(TFTP)等几种网络协议和全局唯一标识符(GUID)、通用网络驱动接口(UNDI)、通用唯一识别码(UUID)的概念并通过对客户机(通过PXE自检的电脑)固件扩展预设的API来实现目的。PXE 客户机(client)这个术语是指机器在PXE启动过程中的角色。一个PXE 客户机(client)可以是一台服务器、桌面级电脑、笔记本电脑或者其他装有PXE启动代码的机器。

   客户机的固件为接受到可用的PXE启动服务器,要在网络中尝试找出PXE重定向服务(DHCP代理)。在分析返回的包后,固件会向合适的启动服务器询问网络自检程序(NBP)的路径,并且通过TFTP协议下载到电脑的内存中,有可能会去校验它,最后执行它。当只有全部的PXE 客户机(client)只使用一个NBP时,全部的PXE 客户机可能会被指定是用BOOTP协议,从而不需要DHCP代理,但是仍然需要TFTP启动服务。

   PXE 协议大致上结合了DHCP和TFTP,虽然都有在两者上面有改进。DHCP用于查找合适的启动服务器,TFTP用于下载初始引导程序和附加文件。为了开始一个PXE自检会话,PXE固件广播一个带有明确的PXE选项DHCPDISCOVER包(扩展DHCPDISCOVER)到67/UDP端口(DHCP服务器端口)。PXE选项是PXE固件有PXE能力的鉴定,但是会被一般的DHCP服务忽略。当固件受到从这样的服务受到DHCPOFFER包时,它会通过要求其提供配置信息来自我配置。

   当 PXE 重定向服务 (DHCP代理) 收到一个 扩展DHCPDISCOVER 包时,它会通过发送一个带有明确的PXE选项DHCPDISCOVER包到PXE客户机的68/UDP端口 (DHCP 客户机端口)来回答。 一个扩展DHCPDISCOVER包主要包含:

         1)一个PXE发现控制领域,以决定是使用多播,广播(网路)或单播来联系PXE启动服务器。 

         2)一个列出可用的PXE启动服务器类型的地址表。 

         3)一个代表每个一个PXE启动服务器类型的条目单。 

         4)一个带有带有提示用户按下哪一个键来看到启动菜单的PXE启动菜单。 

         5)一个超过多长时间就启动第一启动菜单的超时数值。 

   一个DHCP代理服务可能在相同的主机上运行一个标准的DHCP服务器。尽管两个服务不可以共享67/UDP 端口,DHCP代理服务在4011/UDP 端口上运行,要求从客户端来的DHCPDISCOVER 包变成DHCPREQUEST 包。标准DHCP服务在其发送的DHCPOFFER 包中加入特殊的PXE 选项组合,这样PXE客户端知道可以在同一个主机的 4011/UDP 端口找到一个DHCP代理服务。

   和一个正在启动系统的启动服务联系必须有一个IP地址(可能来自DHCP服务)。通过多播或单播一个带有特殊的PXE选项的 DHCPREQUEST 包(扩展DHCPREQUEST包)到 4011/UDP端口,或者广播(网路)这种包到 67/UDP端口。这种包包含有PXE启动服务类型和PXE启动层,一个守护进程允许运行多个启动服务类型。 一个扩展 DHCPREQUEST包可能是一个DHCPINFORM包。下面是PXE具体工作原理图,

wKiom1m-W8aA1g8tAAHGGm8xMd0086.png

简单总结一下:

      PXE Client发送广播包请求DHCP分配IP地址DHCP 

  • Server回复请求,给出IP地址以及Boot 

  • Server的地址PXE下载引导文件执行引导程序 

二、Kickstart 概述

Kickstart 组成

Kickstart 安装选项,包含语言的选择,防火墙,密码,网络,分区的设置等; 

%Pre 部分,安装前解析的脚本,通常用来生成特殊的ks配置,比如由一段程序决定磁盘分区等; 

%Package 部分,安装包的选择,可以是 @core 这样的group的形式,也可以是这样 vim-* 包的形式; 

%Post 部分,安装后执行的脚本,通常用来做系统的初始化设置。比如启动的服务,相关的设定等。


三、Cobbler 简介

1、Cobbler 概述

   Cobbler由python语言开发,是对PXE和Kickstart以及DHCP的封装。融合很多特性,提供了CLI和Web的管理形式。更加方便的实行网络安装。同时,Cobbler也提供了API接口,使用其它语言也很容易做扩展。它不紧可以安装物理机,同时也支持kvm、xen虚拟化、Guest OS的安装。更多的是它还能结合Puppet等集中化管理软件,实现自动化的管理。

2、新旧对比

以前自动化安装系统得先设置一个网络环境,可是设置网络环境涉及到许多步骤,才能为开始安装系统做好准备。你必须:

配置服务,比如 DHCP、TFTP、DNS、HTTP、FTP 和 NFS; 

在 DHCP 和 TFTP 配置文件中填入各个客户端机器的信息; 

创建自动部署文件(比如 kickstart 和 autoinst); 

将安装媒介解压缩到 HTTP/FTP/NFS 存储库中。 

   这个过程并不简单,而且手动注册每个必须配置的客户端机器可能很麻烦。对配置一台机器的任何参数更改(比如要使用一个不同的操作系统),都需要对配置进行手动干预,并有可能对自动部署文件进行手动干预。当机器数量增加时,如果不高度重视文件组织的条理性,TFTP 目录等元素就可能变得混乱。

   Cobbler 通过为机器配置的所有方面创建一个中央管理点,从而解决了这些不足。Cobbler 可重新配置服务,创建存储库,解压缩操作系统媒介,代理或集成一个配置管理系统,控制电源管理等。Cobbler 创建了一个抽象层,您可在其中运行 “add new repository” 或 “change client machine operating system” 等命令。Cobbler 负责处理所有事情:创建或更新配置文件,重新启动服务,或者将媒介解压到新创建的目录中。它的目的是隐藏所有与系统相关的问题,以便您可专注于任务本身。

3、Cobbler 提供的功能

   使用 Cobbler,您无需进行人工干预即可安装机器。Cobbler 设置一个 PXE 引导环境(它还可使用 yaboot 支持 PowerPC),并控制与安装相关的所有方面,比如网络引导服务(DHCP 和 TFTP)与存储库镜像。当希望安装一台新机器时,Cobbler 可以:

使用一个以前定义的模板来配置 DHCP 服务(如果启用了管理 DHCP) 将一个存储库(yum 或 rsync)建立镜像或解压缩一个媒介,以注册一个新操作系统 在 DHCP 配置文件中为需要安装的机器创建一个条目,并使用您指定的参数(IP 和 MAC 地址) 在 TFTFP 服务目录下创建适当的 PXE 文件 重新启动 DHCP 服务以反映更改 重新启动机器以开始安装(如果电源管理已启用)

   Cobbler 支持众多的发行版:Red Hat、Fedora、CentOS、Debian、Ubuntu 和 SuSE。当添加一个操作系统(通常通过使用 ISO 文件)时,Cobbler 知道如何解压缩合适的文件并调整网络服务,以正确引导机器。

   Cobbler 可使用 kickstart 模板。基于 Red Hat 或 Fedora 的系统使用 kickstart 文件来自动化安装流程。通过使用模板,您就会拥有基本的 kickstart 模板,然后定义如何针对一种配置文件或机器配置而替换其中的变量。例如,一个模板可能包含两个变量 $domain和 $machine_name。在 Cobbler 配置中,一个配置文件指定 domain=mydomain.com,并且每台使用该配置文件的机器在machine_name 变量中指定其名称。该配置文件中的所有机器都使用相同的 kickstart 安装且针对 domain=mydomain.com 进行配置,但每台机器拥有其自己的机器名称。您仍然可以使用 kickstart 模板在不同的域中安装其他机器并使用不同的机器名称。

   为了协助管理系统,Cobbler 可通过 fence scripts 连接到各种电源管理环境。Cobbler 支持 apc_snmp、bladecenter、bullpap、drac、ether_wake、ilo、integrity、ipmilan、ipmitool、lpar、rsa、virsh 和 wti。要重新安装一台机器,可运行 reboot system foo命令,而且 Cobbler 会使用必要的凭据和信息来为您运行恰当的 fence scripts(比如机器插槽数)。

   除了这些特性,还可使用一个配置管理系统 (CMS)。您有两种选择:该工具内的一个内部系统,或者集成一个现有的外部 CMS,比如 Chef 或 Puppet。借助内部系统,您可以指定文件模板,这些模板会依据配置参数进行处理(与 kickstart 模板的处理方式一样),然后复制到您指定的位置。如果必须自动将配置文件部署到特定机器,那么此功能很有用。

使用 koan 客户端,Cobbler 可从客户端配置虚拟机并重新安装系统。


四、Cobbler 组成

   Cobbler 的配置结构基于一组注册的对象。每个对象表示一个与另一个实体相关联的实体(该对象指向另一个对象,或者另一个对象指向该对象)。当一个对象指向另一个对象时,它就继承了被指向对象的数据,并可覆盖或添加更多特定信息。以下对象类型的定义为:

发行版:表示一个操作系统。它承载了内核和 initrd 的信息,以及内核参数等其他数据。 

配置文件:包含一个发行版、一个 kickstart 文件以及可能的存储库,还包含更多特定的内核参数等其他数据。 

系统:表示要配给的机器。它包含一个配置文件或一个镜像,还包含 IP 和 MAC 地址、电源管理(地址、凭据、类型)以及更为专业的数据等信息。 

存储库:保存一个 yum 或 rsync 存储库的镜像信息。 

镜像:可替换一个包含不属于此类别的文件的发行版对象(例如,无法分为内核和 initrd 的对象)。 

基于注册的对象以及各个对象之间的关联,Cobbler 知道如何更改文件系统以反映具体配置。因为系统配置的内部是抽象的,所以您可以仅关注想要执行的操作。下面是Cobbler各对象之间的关系图,


wKiom1m-W_fy5mP0AACtHh69DkM221.jpg


五、Cobbler 工作原理

wKioL1m-W-CjsRwLAAD03lrH-Sc591.png

下面我们来简单的说明一下,

Server端:

第一步,启动Cobbler服务 
第二步,进行Cobbler错误检查,执行cobbler check命令 
第三步,进行配置同步,执行cobbler sync命令 
第四步,复制相关启动文件文件到TFTP目录中 
第五步,启动DHCP服务,提供地址分配 
第六步,DHCP服务分配IP地址 
第七步,TFTP传输启动文件 
第八步,Server端接收安装信息 
第九步,Server端发送ISO镜像与Kickstart文件

Client端:

第一步,客户端以PXE模式启动 
第二步,客户端获取IP地址 
第三步,通过TFTP服务器获取启动文件 
第四步,进入Cobbler安装选择界面 
第五步,客户端确定加载信息 
第六步,根据配置信息准备安装系统 
第七步,加载Kickstart文件 
第八步,传输系统安装的其它文件 
第九步,进行安装系统

六、搭建使用Cobbler

1、安装cobbler

     ]#  yum install dhcp tftp rsync xinetd httpd cobbler -y

启动服务:

]# service cobblerd start                             

]# service httpd start

检查配置执行:

]# cobbler check
Traceback (most recent call last):
  File "/usr/bin/cobbler", line 36, in     sys.exit(app.main())
  File "/usr/lib/python2.6/site-packages/cobbler/cli.py", line 657, in main
    rc = cli.run(sys.argv)
  File "/usr/lib/python2.6/site-packages/cobbler/cli.py", line 270, in run
    self.token         = self.remote.login("", self.shared_secret)
  File "/usr/lib64/python2.6/xmlrpclib.py", line 1199, in __call__
    return self.__send(self.__name, args)
  File "/usr/lib64/python2.6/xmlrpclib.py", line 1489, in __request
    verbose=self.__verbose
  File "/usr/lib64/python2.6/xmlrpclib.py", line 1253, in request
    return self._parse_response(h.getfile(), sock)
  File "/usr/lib64/python2.6/xmlrpclib.py", line 1392, in _parse_response
    return u.close()
  File "/usr/lib64/python2.6/xmlrpclib.py", line 838, in close
    raise Fault(**self._stack[0])
xmlrpclib.Fault:

报错解决方法:

~]# service cobblerd restart
Stopping cobbler daemon:                                   [确定]
Starting cobbler daemon:                                   [确定]
[root@example ~]# cobbler get-loaders
task started: 2017-09-17_220217_get_loaders
task started (id=Download Bootloader Content, time=Sun Sep 17 22:02:17 2017)
downloading http://cobbler.github.com/loaders/README to /var/lib/cobbler/loaders/README
downloading http://cobbler.github.com/loaders/COPYING.elilo to /var/lib/cobbler/loaders/COPYING.elilo
downloading http://cobbler.github.com/loaders/COPYING.yaboot to /var/lib/cobbler/loaders/COPYING.yaboot
downloading http://cobbler.github.com/loaders/COPYING.syslinux to /var/lib/cobbler/loaders/COPYING.syslinux
downloading http://cobbler.github.com/loaders/elilo-3.8-ia64.efi to /var/lib/cobbler/loaders/elilo-ia64.efi
downloading http://cobbler.github.com/loaders/yaboot-1.3.17 to /var/lib/cobbler/loaders/yaboot
downloading http://cobbler.github.com/loaders/pxelinux.0-3.86 to /var/lib/cobbler/loaders/pxelinux.0
downloading http://cobbler.github.com/loaders/menu.c32-3.86 to /var/lib/cobbler/loaders/menu.c32
downloading http://cobbler.github.com/loaders/grub-0.97-x86.efi to /var/lib/cobbler/loaders/grub-x86.efi
downloading http://cobbler.github.com/loaders/grub-0.97-x86_64.efi to /var/lib/cobbler/loaders/grub-x86_64.efi
*** TASK COMPLETE ***

在检查配置:

]# cobbler check
The following are potential configuration items that you may want to fix:
 
1 : The 'server' field in /etc/cobbler/settings must be set to something other than localhost, or kickstarting features will not work.  This should be a resolvable hostname or IP for the boot server as reachable by all machines that will use it.
2 : For PXE to be functional, the 'next_server' field in /etc/cobbler/settings must be set to something other than 127.0.0.1, and should match the IP of the boot server on the PXE network.
3 : change 'disable' to 'no' in /etc/xinetd.d/tftp
4 : change 'disable' to 'no' in /etc/xinetd.d/rsync
5 : debmirror package is not installed, it will be required to manage debian deployments and repositories
6 : ksvalidator was not found, install pykickstart
7 : The default password used by the sample templates for newly installed machines (default_password_crypted in /etc/cobbler/settings) is still set to 'cobbler' and should be changed, try: "openssl passwd -1 -salt 'random-phrase-here' 'your-password-here'" to generate new one
8 : fencing tools were not found, and are required to use the (optional) power management features. install cman or fence-agents to use them
 
Restart cobblerd and then run 'cobbler sync' to apply changes.

上面这段信息大意就是:

编辑/etc/cobbler/settings文件,找到 server选项,修改为适当的ip地址,本实例配置ip为:192.168.1.8
编辑/etc/cobbler/settings文件,找到 next_server选项,修改为适当的ip地址,本实例配置ip为:192.168.1.8 
编辑/etc/xinetd.d/tftp文件,将文件中的disable字段的配置由yes改为no 
编辑/etc/xinetd.d/rsync文件,将文件中的disable字段的配置由yes改为no 
提示说debmirror没安装。如果不是安装 debian之类的系统,此提示可以忽略。
ksvalidator没有被发现,安装pykickstart 
修改cobbler用户的默认密码,可以使用如下命令生成密码,并使用生成后的密码替换/etc/cobbler/settings中的密码。
fencing tools未安装。

操作如下:

[root@example ~]# vim /etc/cobbler/settings
server: 192.168.1.8
next_server: 192.168.1.8
[root@example ~]# vim /etc/xinetd.d/tftp
disable=no
[root@example ~]# vim /etc/xinetd.d/rsync
disable=no
[root@example ~]# yum install -y pykickstart
[root@proxy ~]# openssl passwd -1 -salt `openssl rand -hex 4`Password: $1$76f29b0d$R3nuR/TTUJexv9cWb.QsI1
[root@example ~]# vim /etc/cobbler/settings
default_password_crypted: "$1$76f29b0d$R3nuR/TTUJexv9cWb.QsI1"
[root@example ~]#  yum install fence-agents -y

重启服务并检测:

[root@example ~]# /etc/init.d/cobblerd restart
[root@example ~]# /etc/init.d/xinetd restart
[root@example ~]# cobbler check  
The following are potential configuration items that you may want to fix:
 
1 : debmirror package is not installed, it will be required to manage debian deployments and repositories
 
Restart cobblerd and then run 'cobbler sync' to apply changes.
2、添加distro(distribution):
[root@example ~]# mount /dev/cdrom /mnt/ -r
[root@example ~]# cobbler import --path=/mnt/ --name=CentOS-6.6 --arch=x86_64
task started: 2017-09-17_222129_import
task started (id=Media import, time=Sun Sep 17 22:21:29 2017)
Found a candidate signature: breed=redhat, version=rhel6
Found a matching signature: breed=redhat, version=rhel6
Adding distros from path /var/www/cobbler/ks_mirror/CentOS-6.6-X86_64-x86_64:
creating new distro: CentOS-6.6-X86_64-x86_64
trying symlink: /var/www/cobbler/ks_mirror/CentOS-6.6-X86_64-x86_64 -> /var/www/cobbler/links/CentOS-6.6-X86_64-x86_64
creating new profile: CentOS-6.6-X86_64-x86_64
associating repos
checking for rsync repo(s)
checking for rhn repo(s)
checking for yum repo(s)
starting descent into /var/www/cobbler/ks_mirror/CentOS-6.6-X86_64-x86_64 for CentOS-6.6-X86_64-x86_64
processing repo at : /var/www/cobbler/ks_mirror/CentOS-6.6-X86_64-x86_64
need to process repo/comps: /var/www/cobbler/ks_mirror/CentOS-6.6-X86_64-x86_64
looking for /var/www/cobbler/ks_mirror/CentOS-6.6-X86_64-x86_64/repodata/*comps*.xml
Keeping repodata as-is :/var/www/cobbler/ks_mirror/CentOS-6.6-X86_64-x86_64/repodata
*** TASK COMPLETE ***

查看是否导入成功:

[root@example ~]# cobbler distro list
   CentOS-6.6-X86_64-x86_64

参数说明:

--name  为安装源定义一个名字

--arch    指定安装源是32位还是64位、ia64, 目前支持的选项有: x86│x86_64│ia64

注意: 这个安装源的唯一标示 就是根据这两个参数来定义 本例导入成功后,安装源的唯一标示就是:centos6.3-x86_64 ,如果重复,系统会提示导入失败。

3、配置dhcp服务

[root@example ~]# vim /etc/cobbler/settings
manage_dhcp: 1
[root@example ~]# mv /etc/cobbler/dhcp.template{,.bak}
[root@example ~]# vim /etc/cobbler/dhcp.template
subnet 192.168.1.0 netmask 255.255.255.0 {
  option routers    192.168.1.1;
  option domain-name-servers 192.168.1.1;
  option subnet-mask     255.255.255.0;
  range dynamic-bootp       192.168.1.30 192.168.1.100;
  default-lease-time      21600;
  max-lease-time     43200;
  next-server  $next_server;
  class "pxeclients" {
    match if substring (option vendor-class-identifier, 0, 9) = "PXEClient";
    if option pxe-system-type = 00:02 {
         filename "ia64/elilo.efi";
    } else if option pxe-system-type = 00:06 {
         filename "grub/grub-x86.efi";
    } else if option pxe-system-type = 00:07 {
         filename "grub/grub-x86_64.efi";
    } else {
         filename "/pxelinux.0";
    }
  }
}
[root@example ~]# /etc/init.d/xinetd restart

同步cobbler配置

[root@example ~]# cobbler sync

task started: 2017-09-17_223050_sync

task started (id=Sync, time=Sun Sep 17 22:30:50 2017)

running pre-sync triggers

cleaning trees

removing: /var/

www/cobbler/p_w_picpaths/CentOS-6.6-X86_64-x86_64

removing: /var/lib/tftpboot/pxelinux.cfg/default

removing: /var/lib/tftpboot/grub/p_w_picpaths

removing: /var/lib/tftpboot/grub/efidefault

removing: /var/lib/tftpboot/p_w_picpaths/CentOS-6.6-X86_64-x86_64

removing: /var/lib/tftpboot/s390x/profile_list

copying bootloaders

trying hardlink /var/lib/cobbler/loaders/pxelinux.0 -> /var/lib/tftpboot/pxelinux.0

trying hardlink /var/lib/cobbler/loaders/menu.c32 -> /var/lib/tftpboot/menu.c32

trying hardlink /var/lib/cobbler/loaders/yaboot -> /var/lib/tftpboot/yaboot

trying hardlink /var/lib/cobbler/loaders/grub-x86.efi -> /var/lib/tftpboot/grub/grub-x86.efi

trying hardlink /var/lib/cobbler/loaders/grub-x86_64.efi -> /var/lib/tftpboot/grub/grub-x86_64.efi

copying distros to tftpboot

copying files for distro: CentOS-6.6-X86_64-x86_64

trying hardlink /var/

www/cobbler/ks_mirror/CentOS-6.6-X86_64-x86_64/p_w_picpaths/pxeboot/vmlinuz

 -> /var/lib/tftpboot/p_w_picpaths/CentOS-6.6-X86_64-x86_64/vmlinuz

trying hardlink /var/

www/cobbler/ks_mirror/CentOS-6.6-X86_64-x86_64/p_w_picpaths/pxeboot/initrd.img

 -> /var/lib/tftpboot/p_w_picpaths/CentOS-6.6-X86_64-x86_64/initrd.img

copying p_w_picpaths

generating PXE configuration files

generating PXE menu structure

copying files for distro: CentOS-6.6-X86_64-x86_64

trying hardlink /var/

www/cobbler/ks_mirror/CentOS-6.6-X86_64-x86_64/p_w_picpaths/pxeboot/vmlinuz

 -> /var/

www/cobbler/p_w_picpaths/CentOS-6.6-X86_64-x86_64/vmlinuz

trying hardlink /var/

www/cobbler/ks_mirror/CentOS-6.6-X86_64-x86_64/p_w_picpaths/pxeboot/initrd.img

 -> /var/

www/cobbler/p_w_picpaths/CentOS-6.6-X86_64-x86_64/initrd.img

Writing template files for CentOS-6.6-X86_64-x86_64

rendering TFTPD files

generating /etc/xinetd.d/tftp

processing boot_files for distro: CentOS-6.6-X86_64-x86_64

cleaning link caches

running post-sync triggers

running python triggers from /var/lib/cobbler/triggers/sync/post/*

running python trigger cobbler.modules.sync_post_restart_services

running shell triggers from /var/lib/cobbler/triggers/sync/post/*

running python triggers from /var/lib/cobbler/triggers/change/*

running python trigger cobbler.modules.scm_track

running shell triggers from /var/lib/cobbler/triggers/change/*

*** TASK COMPLETE ***

cobbler会自动进行初始化工作,移除已经存在的启动项,然后根据模板拷贝loader文件。之后再生成pxe的配置文件,生成dhcp的配置文件,最后再重启dhcp服务。 至此,就可以使用虚拟机来测试cobbler安装了。 OK开启真机或者虚拟机来测试注意开启网络引导 网卡要开启PXE引导程序 。

配置启动dhcp服务:

[root@example ~]# vim /etc/dhcp/dhcpd.conf
subnet 192.168.1.0 netmask 255.255.255.0 {
option routers 192.168.1.1;
option domain-name-servers 192.168.1.1;
option subnet-mask 255.255.255.0;
range dynamic-bootp 192.168.1.121 192.168.1.125;
filename "/pxelinux.0";
default-lease-time 21600;
max-lease-time 43200;
next-server 192.168.1.8;
}
[root@example ~]# service dhcpd restart

4、测试使用Cobbler                    

将启动项改为网卡启动

wKiom1m-XDyypPnsAADjBK3G4FM452.jpg

启动服务后出现此界面:

wKioL1m-XB7QlK_cAACl8rKxcg4587.jpg

默认安装后查看系统:

wKioL1m-XDOSmInUAAHliMzmAO4280.jpg

5、添加profile

[root@example ~]# cd /var/lib/cobbler/kickstarts/
[root@example kickstarts]# cp sample_end.ks CentOS-6.6-X86_64-basic 
[root@example kickstarts]# cobbler profile add --name=CentOS-6.4-x86_64-basic --distro=CentOS-6.6-X86_64-x86_64 --kickstart=/var/lib/cobbler/kickstarts/CentOS-6.6-X86_64-basic 
[root@example kickstarts]# cobbler sync

查看是否生成:

[root@example ~]# cobbler profile list
   CentOS-6.4-x86_64-basic
   CentOS-6.6-X86_64-x86_64

wKiom1m-XHjhHcLdAAC9f9W8JxQ021.jpg

七、Cobbler相关选项说明

1、Cobbler 常用命令详解

cobbler check #检查cobbler配置 
cobbler sync #同步配置到dhcp/pxe和数据目录 
cobbler list #列出所有的cobbler元素 
cobbler import #导入安装的系统镜像 
cobbler report #列出各元素的详细信息 
cobbler distro #查看导入的发行版系统信息 
cobbler profile #查看配置信息 
cobbler system #查看添加的系统信息 
cobbler reposync #同步yum仓库到本地

2、导入镜像文件

命令:cobbler import --path=镜像路径 -- name=安装引导名 --arch=32位或64位

参数:
path 是镜像所挂载的目录 
name 是导入到cobbler里面显示的名字 
arch 是32位系统还是64位系统

3、导入kickstart文件

命令:cobbler profile add --name=list名 --distro=镜像 --kickstart=路径

参数:
name是表示添加的ks 的名字,用cobbler report可以看到这个名字 
distro 是用哪个镜像,list的distros里面选择一个,需要版本相对应 
kickstart 是具体的 ks 文件路径

4、同步DHCP、HTTPD

命令:cobbler sync

注,每次修改完dhcp.template之类的配置文件需要执行一次使其生效。

5、查看Cobbler列表

命令:cobbler list

注,列出Cobbler所有的元素。

6、删除相关列表

命令:cobbler distro/profile remove --name=要删除的引导文件名

删除指定 distro , 也就是镜像

删除指定的 profile 文件,也就是 ks

7、Cobbler安装后目录说明

cobbler配置文件目录/etc/cobbler:

/etc/cobbler/settings cobbler主配置文件 
/etc/cobbler/iso/ iso模板配置文件 
/etc/cobbler/pxe pxe模板文件 
/etc/cobbler/power 电源的配置文件 
/etc/cobbler/users.conf Web 服务授权配置文件 
/etc/cobbler/users.digest 用于web访问的用户名密码配置文件 
/etc/cobbler/dhcp.template DHCP服务的配置模板 
/etc/cobbler/dnsmasq.template DNS服务的配置模板 
/etc/cobbler/tftpd.template tftp服务的配置模板 
/etc/cobbler/modules.conf Cobbler模块配置文件

cobbler数据目录/var/lib/cobbler:

/var/lib/cobbler/config/ 用于存放distros、systems、profiles等信息配置文件 
/var/lib/cobbler/triggers 用于存放用户定义的cobbler 命令 
/var/lib/cobbler/kickstarts/ 默认存放kickstart文件 
/var/lib/cobbler/loaders 存放的各种引导程序

镜像数据目录/var/www/cobbler:

/var/www/cobbler/ks_mirror/ 导入的发行版系统的所有数据 
/var/www/cobbler/p_w_picpaths/ 导入发行版的Kernel和initrd镜像用于远程网络启动 
/var/www/cobbler/repo_mirror/ yum仓库存储目录

日志目录 /var/log/cobbler/:

/var/log/cobbler/install.log 客户端的安装系统日志 
/var/log/cobbler/cobbler.log cobbler日志

2、自动化运维工具ansible的应用示例。

1、Ansible基础安装

(1)、python2.7安装

https://www.python.org/ftp/python/2.7.8/Python-2.7.8.tgz

# tar xvzf Python-2.7.8.tgz

# cd Python-2.7.8

# ./configure --prefix=/usr/local

# make --jobs=`grep processor/proc/cpuinfo | wc -l`

# make install

## 将python头文件拷贝到标准目录,以避免编译ansible时,找不到所需的头文件

# cd /usr/local/include/python2.7

# cp -a ./* /usr/local/include/

## 备份旧版本的python,并符号链接新版本的python

# cd /usr/bin

# mv python python2.6

# ln -s /usr/local/bin/python

## 修改yum脚本,使其指向旧版本的python,已避免其无法运行

# vim /usr/bin/yum

#!/usr/bin/python  -->  #!/usr/bin/python2.6

(2)、setuptools模块安装

https://pypi.python.org/packages/source/s/setuptools/setuptools-7.0.tar.gz

# tar xvzf setuptools-7.0.tar.gz

# cd setuptools-7.0

# python setup.py install

(3)、pycrypto模块安装

https://pypi.python.org/packages/source/p/pycrypto/pycrypto-2.6.1.tar.gz

# tar xvzf pycrypto-2.6.1.tar.gz

# cd pycrypto-2.6.1

# python setup.py install

(4)、PyYAML模块安装

http://pyyaml.org/download/libyaml/yaml-0.1.5.tar.gz

# tar xvzf yaml-0.1.5.tar.gz

# cd yaml-0.1.5

# ./configure --prefix=/usr/local

# make --jobs=`grep processor/proc/cpuinfo | wc -l`

# make install

https://pypi.python.org/packages/source/P/PyYAML/PyYAML-3.11.tar.gz

# tar xvzf PyYAML-3.11.tar.gz

# cd PyYAML-3.11

# python setup.py install

(5)、Jinja2模块安装

https://pypi.python.org/packages/source/M/MarkupSafe/MarkupSafe-0.9.3.tar.gz

# tar xvzf MarkupSafe-0.9.3.tar.gz

# cd MarkupSafe-0.9.3

# python setup.py install

https://pypi.python.org/packages/source/J/Jinja2/Jinja2-2.7.3.tar.gz

# tar xvzf Jinja2-2.7.3.tar.gz

# cd Jinja2-2.7.3

# python setup.py install

(6)、paramiko模块安装

https://pypi.python.org/packages/source/e/ecdsa/ecdsa-0.11.tar.gz

# tar xvzf ecdsa-0.11.tar.gz

# cd ecdsa-0.11

# python setup.py install

https://pypi.python.org/packages/source/p/paramiko/paramiko-1.15.1.tar.gz

# tar xvzf paramiko-1.15.1.tar.gz

# cd paramiko-1.15.1

# python setup.py install

(7)、simplejson模块安装

https://pypi.python.org/packages/source/s/simplejson/simplejson-3.6.5.tar.gz

# tar xvzf simplejson-3.6.5.tar.gz

# cd simplejson-3.6.5

# python setup.py install

(8)、ansible安装

https://github.com/ansible/ansible/archive/v1.7.2.tar.gz

# tar xvzf ansible-1.7.2.tar.gz

# cd ansible-1.7.2

# python setup.py install

2、Ansible配置

(1)、SSH免密钥登录设置

## 生成公钥/私钥

# ssh-keygen -t rsa -P ''

## 写入信任文件(将/root/.ssh/id_rsa_storm1.pub分发到其他服务器,并在所有服务器上执行如下指令):

# cat /root/.ssh/id_rsa_storm1.pub >> /root/.ssh/authorized_keys

# chmod 600 /root/.ssh/authorized_keys

(2)、ansible配置

# mkdir -p /etc/ansible

# vim /etc/ansible/ansible.cfg

remote_port = 36000

private_key_file = /root/.ssh/id_rsa_storm1

## 主机组定义

# vim /etc/ansible/hosts

[storm_cluster]

10.223.55.100

10.223.55.101

10.223.38.226

10.223.38.227

10.223.39.216

10.223.25.123


(3)、简单测试

# ansible storm_cluster -m command -a 'uptime'


说明:第一次运行时,需要输入一下“yes”【进行公钥验证】,后续无需再次输入。


## 再次运行

# ansible storm_cluster -m command -a 'uptime'

3、常用模块使用

(1)、setup

## 用来查看远程主机的一些基本信息

# ansible storm_cluster -m setup

(2)、ping

## 用来测试远程主机的运行状态

# ansible storm_cluster -m ping

(3)、file

## 设置文件的属性

相关选项如下:

force:需要在两种情况下强制创建软链接,一种是源文件不存在,但之后会建立的情况下;另一种是目标软链接已存在,需要先取消之前的软链,然后创建新的软链,有两个选项:yes|no

group:定义文件/目录的属组

mode:定义文件/目录的权限

owner:定义文件/目录的属主

path:必选项,定义文件/目录的路径

recurse:递归设置文件的属性,只对目录有效

src:被链接的源文件路径,只应用于state=link的情况

dest:被链接到的路径,只应用于state=link的情况

state:

       directory:如果目录不存在,就创建目录

       file:即使文件不存在,也不会被创建

       link:创建软链接

       hard:创建硬链接

       touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间

       absent:删除目录、文件或者取消链接文件

示例:

## 远程文件符号链接创建

# ansible storm_cluster -m file -a "src=/etc/resolv.conf dest=/tmp/resolv.conf state=link"

## 远程文件信息查看

# ansible storm_cluster -m command -a "ls –al /tmp/resolv.conf"

## 远程文件符号链接删除

# ansible storm_cluster -m file -a "path=/tmp/resolv.conf state=absent"

## 远程文件信息查看

# ansible storm_cluster -m command -a "ls -al /tmp/resolv.conf"

(4)copy

## 复制文件到远程主机

相关选项如下:

backup:在覆盖之前,将源文件备份,备份文件包含时间信息。有两个选项:yes|no

content:用于替代“src”,可以直接设定指定文件的值

dest:必选项。要将源文件复制到的远程主机的绝对路径,如果源文件是一个目录,那么该路径也必须是个目录

directory_mode:递归设定目录的权限,默认为系统默认权限

force:如果目标主机包含该文件,但内容不同,如果设置为yes,则强制覆盖,如果为no,则只有当目标主机的目标位置不存在该文件时,才复制。默认为yes

others:所有的file模块里的选项都可以在这里使用

src:被复制到远程主机的本地文件,可以是绝对路径,也可以是相对路径。如果路径是一个目录,它将递归复制。在这种情况下,如果路径使用“/”来结尾,则只复制目录里的内容,如果没有使用“/”来结尾,则包含目录在内的整个内容全部复制,类似于rsync。

示例:

## 将本地文件“/etc/ansible/ansible.cfg”复制到远程服务器

# ansible storm_cluster -m copy -a "src=/etc/ansible/ansible.cfg dest=/tmp/ansible.cfg owner=root group=root mode=0644"

## 远程文件信息查看

# ansible storm_cluster -m command -a "ls -al /tmp/ansible.cfg"

(5)、command

## 在远程主机上执行命令

相关选项如下:

creates:一个文件名,当该文件存在,则该命令不执行

free_form:要执行的linux指令

chdir:在执行指令之前,先切换到该目录

removes:一个文件名,当该文件不存在,则该选项不执行

executable:切换shell来执行指令,该执行路径必须是一个绝对路径

示例:

# ansible storm_cluster -m command -a "uptime"

(6)、shell

## 切换到某个shell执行指定的指令,参数与command相同。

与command不同的是,此模块可以支持命令管道,同时还有另一个模块也具备此功能:raw

示例:

## 先在本地创建一个SHELL脚本

# vim /tmp/rocketzhang_test.sh

#!/bin/sh

date +%F_%H:%M:%S

#chmod +x /tmp/rocketzhang_test.sh

## 将创建的脚本文件分发到远程

# ansible storm_cluster -m copy -a "src=/tmp/rocketzhang_test.sh dest=/tmp/rocketzhang_test.sh owner=root group=root mode=0755"

## 远程执行

# ansible storm_cluster -m shell -a "/tmp/rocketzhang_test.sh"

(7)、更多模块

其他常用模块,比如:service、cron、yum、synchronize就不一一例举,可以结合自身的系统环境进行测试。

service:系统服务管理

cron:计划任务管理

yum:yum软件包安装管理

synchronize:使用rsync同步文件

user:系统用户管理

group:系统用户组管理

更多模块可以参考:

#ansible-doc –l

http://docs.ansible.com/modules_by_category.html

http://www.ansible.cn/docs/

(国内的一个镜像站点,避免被墙 )

(8)、一些概念补充

playbook的组成:playbook是由一个或多个“play”组成的列表,可以让它们联同起来按事先编排的机制执行;所谓task无非是调用ansible的一个module,而在模块参数中可以使用变量;模块执行是幂等的,这意味着多次执行是安全的,因为其结果均一致;

执行模型:task list中的各任务按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个任务后再开始第二个。在顺序运行某playbook时,如果中途发生错误,所有已执行任务都将回滚,因此,在修改playbook后重新执行一次即可;

task组成:每个task都应该有其name,用于playbook的执行结果输出,建议其内容尽可能清晰地描述任务执行步骤。如果未提供name,则action的结果将用于输出;

notify指定handler的执行机制:“notify”这个action可用于在每个play的最后被触发,在notify中列出的操作称为handler,仅在所有的变化发生完成后一次性地执行指定操作。

3、概述监控工具zabbix的工作原理,并从零构建一套完整的监控体系,实现短信、邮件等方式报警。

一、什么是zabbix及优缺点(对比cacti和nagios)

Zabbix能监视各种网络参数,保证服务器系统的安全运营;并提供灵活的通知机制以让系统管理员快速定位/解决存在的各种问题。是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。

agent端:主机通过安装agent方式采集数据。

server端:通过收集agent发送的数据,写入数据库(MySQL,ORACLE等),再通过php+apache在web前端展示.

zabbix = cacti + nagios

  • 优点:基于两款工具优点于一身并更强大,实现企业级分布式监控。

  • 缺点:2.2版本带宽占用大但是升级到2.4版本后更节省了带宽资源,其它再无发现。

二、监控功能

主机的性能监控、网络设备性能监控、数据库性能监控、多种告警方式、详细的报表图表绘制

监控主机zabbix有专用的agent,可以监控Linux,Windows,FreeBSD等 。

监控网络设备zabbix通过SNMP,ssh(不多用)

可监控对象

  • 设备:服务器,路由器,交换机

  • 软件:OS,网络,应用程序

  • 主机性能指标监控

  • 故障监控: down机,服务不可用,主机不可达

二、工作原理

一个监控系统运行的大概的流程是这样的:

zabbix agent需要安装到被监控的主机上,它负责定期收集各项数据,并发送到zabbix server端,zabbix server将数据存储到数据库中,zabbix web根据数据在前端进行展现和绘图。这里agent收集数据分为主动和被动两种模式:

主动:agent请求server获取主动的监控项列表,并主动将监控项内需要检测的数据提交给server/proxy

被动:server向agent请求获取监控项的数据,agent返回数据。

三、zabbix监控环境中基本概念

1、主机(host):要监控的网络设备,可由IP或DNS名称指定;

2、主机组(host group):主机的逻辑容器,可以包含主机和模板,但同一个组织内的主机和模板不能互相链接;主机组通常在给用户或用户组指派监控权限时使用;

3、监控项(item):一个特定监控指标的相关的数据;这些数据来自于被监控对象;item是zabbix进行数据收集的核心,相对某个监控对象,每个item都由"key"标识;

4、触发器(trigger):一个表达式,用于评估某监控对象的特定item内接收到的数据是否在合理范围内,也就是阈值;接收的数据量大于阈值时,触发器状态将从"OK"转变为"Problem",当数据再次恢复到合理范围,又转变为"OK";

5、事件(event):触发一个值得关注的事情,比如触发器状态转变,新的agent或重新上线的agent的自动注册等;

6、动作(action):指对于特定事件事先定义的处理方法,如发送通知,何时执行操作;

7、报警升级(escalation):发送警报或者执行远程命令的自定义方案,如每隔5分钟发送一次警报,共发送5次等;

8、媒介(media):发送通知的手段或者通道,如Email、Jabber或者SMS等;

9、通知(notification):通过选定的媒介向用户发送的有关某事件的信息;

10、远程命令(remote command):预定义的命令,可在被监控主机处于某特定条件下时自动执行;

11、模板(template):用于快速定义被监控主机的预设条目集合,通常包含了item、trigger、graph、screen、application以及low-level discovery rule;模板可以直接链接至某个主机;

12、应用(application):一组item的集合;

13、web场景(web scennario):用于检测web站点可用性的一个活多个HTTP请求;

14、前端(frontend):Zabbix的web接口;

 前提条件:

(1) zabbix服务器端已经成功安装并且运行。

(2) zabbix客户端已经成功建立并且运行。

1 下载并且安装msmtp软件

Wget http://sourceforge.net/projects/msmtp/files/msmtp/1.4.32/msmtp-1.4.32.tar.bz2/download

tar jxvf msmtp-1.4.32.tar.bz2

cd msmtp-1.4.32

./configure--prefix=/usr/local/msmtp

Make

Make install

2、手动建立配置文件,输入外部smtp地址
mkdir –p /usr/local/msmtp/etc
vi /usr/local/msmtp/etc/msmtprc
添加以下内容
account default 
host smtp.sohu.com                    #你的发送邮件服务器
port 25
from zabbix2014@sohu.com      #要从哪个邮箱发出
auth login
tls off
user  zabbix2014                      #邮箱用户名
password xxxxx-xxx                  #邮箱密码,如果你觉得不安全可以把文件改为600属性
logfile /var/log/mmlog
保存退出。

3、简单测试一下
/usr/local/msmtp/bin/msmtp  zabbix2014@sohu.com 
hello,test 
ctrl d
cat /usr/local/msmtp/msmtp.log 看看有没有成功。 
  然后再到sohu邮箱中,看看信收到没有

报错如下

[root@cache-2 msmtp-1.4.32]# /usr/local/msmtp/bin/msmtp zabbix2014@sohu.com
msmtp: authentication failed (method LOGIN)
msmtp: server message: 535 5.7.0 Invalid result
msmtp: could not send mail (account default from /usr/local/msmtp/etc/msmtprc)

Google之后,需要安装 mutt组件

4、下面开始安装 MUTT如果是CentOS的话直接用yum就好了
yum install mutt
安装完成后要手动给他建立一个配置文件,
vim /etc/Muttrc
setsendmail="/usr/local/msmtp/bin/msmtp" #你的msmtp命令路径
set use_from=yes
set realname="zabbix2014@sohu.com"
set editor="vim"
简单的4行就可以了
好了,让我们来测试一下吧!
测试一下:echo"test mail" | mutt -s "test" zabbix2014@sohu.com

OK,测试了下,能收到已经发送的email,如下所示:

echo"test mail 2014 content tom 2" | mutt -s "test 2014 title2"  zabbix2014@sohu.com

5、    创建 zabbix用于发送邮件的脚本

脚本放在什么位置随便,但是要保证zabbix可以找到!

1)vim/usr/bin/zabbix2014,并写入如下内容:
#!/bin/bash
echo "$3" | mutt -s "$2"$1       # $3表示邮件内容、$2表示邮件标题、$1表示收件人
(2)chmod a+x /usr/bin/zabbix2014

6、    zabbix配置
(1)创建meida types
1.登录到zabbix,进入“Administration" >> ”Media types",点击右上角“Create Media Type"。 Description填"mediatype-zabbix2014"或其它名称,Type选择"Script",Script填” zabbix2014”。
2.点击save保存.

7、创建actions
1.登录到zabbix,进入"Configation" >> "Actions",点击右上角"Create Actions"。输入Name “action-zabbix2014” ,其它都默认点击右侧“Action Operations"下的"New"按钮,"Operation Type"选择"Send message","Send Message to"选择一个或多个要发送消息的用户组,”Send only to"选择我们之前新增的mediatype-zabbix2014。

2.点击save保存.


8、zabbix用户配置
登录到zabbix, 进入"Adimistration" >>"Users",在之前选定要发送消息的组里的Members栏位里选择一个用户,例如选择AdminZabbix用户。
在用户信息修改界面最下方的”Media"处点击"Add"按钮。
Type选择"mediatype- zabbix2014",Send to填入收件人地址,点击Add添加。
点击"Save"保存配置。


9 测试验证邮件发送功能是否正常。

PS:这个验证报警的实现,请参考 http://blog.csdn.net/mchdba/article/details/24540017 里面有描述mysql.ping_test是如何建立并生效的。

9.1 去stop服务器上的mysql服务,一会就应该会报警

[root@db-m2-slave-1~]# service mysql stop

Shutting downMySQL...                                    [确定]

但是没有收到email,所以我们需要去看events,是否有提示为什么会发不出email来。进去目录Monitoring—> Events?Group(选All)?Host(选要监控的数据库主机)?Source(选Trigger)。

点开最左边一列的连接 17 Sun 2017 22:00:06 ,

看到提示:

/usr/local/zabbix/scripts/zabbix2014: [2] Nosuch file or directory

记得是放在 /usr/bin/zabbix2014 ,所以将脚本放在提示所需要的目录上面,直接mv一下即可:

mv/usr/bin/zabbix2014 /usr/local/zabbix/scripts/zabbix2014

之后会看到新的报警PROBLEM信息,email已经发送出去了.

9.2 改email地址,改成139邮箱,并且附带免费短信报警功能实现。

进入目录,Administration?Users? Zabbix administrators? Users (1)? AdminZabbix(最左边一列)?Media(选择中间的那一个栏目)—> mediatype-zabbix2014(选择用Trigger所用的mediatype)?Edit(点击进去修改)?Send to(后面的输入框里面填写上139的email,比如xxx@139.com)

9.3 切换139邮箱来验证发送短信功能

注册139邮箱,打开email,stop以及start数据库上面的mysql进程服务,就会收到报警email以及短信通知,报警email如下:

记得开启短信提示功能,短信免费。

9.4 如何让zabbix继续发送报警信息直到恢复正常为止。

进入目录,Configuration->Hosts->选中主机->Trigger->Name(比如进入check_mysql_status)->在Multiple PROBLEM events generation一栏打勾,然后点击Save即可。

10 总结:

第一次zabbix的邮件报警试验成功了,折腾了很多天,也咨询了很多朋友,在此感谢他们,下面还有许多zabbix的深入的东西需要继续学习继续专研。

附上网友北京酱油帝的建议,如何验证trigger报警成功:

要想验证trigger的有效性很简单:

第一,trigger在monitor的界面有个events选项看到没有,那里面是可以点击机器ip的,你看你定义的trigger有没有发生。

第二,  第二,如果trigger发生了,是要看脚本也就是media调用有没有成功,如果成功了,最好在脚本里面加上日志。

参考文章:http://bbs.hx95.com/read-htm-tid-181423.html