使用 kickstart include 指令遇到的问题

先说一下 ksverdiff 这个命令可用来确认 kickstart 大版本之间的差异,比如看 Centos7 和 Centos6 的差异用:

ksverdiff -f RHEL6 -t RHEL7

还有一个命令 ksvalidator 用来确认 ks 语法是否有问题。

这两个命令都是来自 pykickstart 包,安装:

yum -y install pykickstart

 

我遇到的第一个问题

在安装 Centos 7 的时候,在 ks 文件中通过 include 文本的方式来包含下面 url 配置的时候,会报错,报错如下面 截图。

# Use Net Install installation 

url –url http://pxe.hy01.nosa.me/iso/centos_7.0_x64

报错原因 可能和 「执行顺序」 有关,具体待查。

1

直接把 url 那行配置写在 ks 文件里,貌似可以正常装机,只是报下面的错。

2

 

第二个问题

Centos6 和 Centos7 貌似不太一样,我把 url 这行配置写在 ks 文件中,然后下面的 keyboard 和 lang  通过 include 引入。

# System keyboard
keyboard us

# System language
lang en_US.UTF-8

然后就报了下面的错,说明 Centos6 的 keyboard 和 lang 还是应该直接写在 ks 文件里。

3

 

 

RHEL7 的 kickstart 语法参考链接:

https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Installation_Guide/sect-kickstart-syntax.html#sect-kickstart-commands

 

构建机房运维基础架构(十三): 搭建NTP服务

安装:

yum -y install ntp ntpdate

配置文件:

<pre># ntp.conf: Managed by puppet.
#
# Keep ntpd from panicking in the event of a large clock skew
# when a VM guest is suspended and resumed.
tinker panic 0

# Permit time synchronization with our time source, but do not'
# permit the source to query or modify the service on this system.'
restrict default kod nomodify notrap nopeer noquery
restrict -6 default kod nomodify notrap nopeer noquery
restrict 127.0.0.1
restrict -6 ::1
server 0.pool.ntp.org
server 1.pool.ntp.org
server stdtime.gov.hk

# Undisciplined Local Clock. This is a fake driver intended for backup
# and when no outside source of synchronized time is available.
server 127.127.1.0
fudge 127.127.1.0 stratum 10
restrict 127.127.1.0


# Driftfile.
driftfile /var/lib/ntp/drift

 

其他机器同步时间用:


/usr/sbin/ntpdate $ntp_server_ip &>/dev/null ;clock -w

另外:

1.ntp server 配置文件 和其他机器同步命令 都用Puppet管理。

2.最好要两台NTP 服务器(接入一台交换机),起一个VIP指向这两台机器,并且在接入交换机上打开 源IP、源端口、目的IP、目的端口 的哈希功能(在等价路由基础上),这其实是实现了流量的负载均衡和高可用(具体咨询搞网络的同学)。

 

构建机房运维基础架构(十二): 自建Centos YUM仓库

镜像仓库的搭建

镜像仓库主要做两个,一个是 Centos 官方的仓库,作为日常软件安装,一个是 puppetlabs 的仓库,安装 puppet 使用。

1.创建一个 repo 目录

mkdir /home/repo

2.Centos 官方的仓库是支持 rsync 的,使用如下脚本 yum-repo-update.sh,每天定时就可以同步( rsync 指定 delete 参数删除本地已经不存在镜像中的包,可以避免一些重复包的问题 ):

#!/bin/bash

rsync="rsync -avrt –bwlimit=10240 –delete"
mirror="rsync://ftp.jaist.ac.jp/pub/Linux/CentOS/"

local="/home/repo"
verlist="6 7"
archlist="x86_64"
baselist="os updates extras centosplus contrib"

for ver in $verlist
do
    for arch in $archlist
    do
        for base in $baselist
        do
            remote=$mirror/$ver/$base/$arch/
            mkdir -p $local/centos/$ver/$base/$arch/
            $rsync $remote $local/centos/$ver/$base/$arch/
        done
    done
done

3.puppetlabs 仓库不支持 rsync, 我们使用 yum-utils 中的 reposync来同步,该命名会判断已存在文件而不下载。

先安装 yum-utils:
yum install yum-utils

然后配置脚本,也每天定时跑同步即可(这里注意,reposync 只能同步与宿主机相同版本的软件包,这里我们就只同步 centos6 版本的)

首先要安装一下 puppetlbas 的仓库。

rpm -ivh http://yum.puppetlabs.com/puppetlabs-release-el-6.noarch.rpm

最终脚本:

#!/bin/bash

rsync="rsync -avrt –bwlimit=10240 –delete"
mirror="rsync://ftp.jaist.ac.jp/pub/Linux/CentOS/"

local="/home/repo"
verlist="6 7"
archlist="x86_64"
baselist="os updates extras centosplus contrib"

for ver in $verlist
do
    for arch in $archlist
    do
        for base in $baselist
        do
            remote=$mirror/$ver/$base/$arch/
            mkdir -p $local/centos/$ver/$base/$arch/
            $rsync $remote $local/centos/$ver/$base/$arch/
        done
    done
done

mkdir -p $local/puppetlabs/6/x86_64
cd $local/puppetlabs/6/x86_64
reposync –repoid=puppetlabs-products

自建仓库的搭建

自建仓库用于公司内部自己打的 rpm 包。

yum -y install createrepo
mkdir -p /home/repo/wandoulabs/6/x86_64/
createrepo /home/repo/wandoulabs/6/x86_64/

入口域名

在服务器上搭建 Nginx,配置文件类似:

server {
listen 80;
server_name mirrors.internal.nosa.me;

access_log logs/mirrors.internal.nosa.access.log;
root /home/repo;

    location / {
        autoindex on;
        index index.html;
    }
}

构建仓库 release 包

将仓库的配置打包成一个 rpm 包,方便管理和升级。

1.repo 文件

[wbase]
name=CentOS-$releasever - Base Wandoulabs
baseurl=http://mirrors.internal.nosa.me/centos/$releasever/os/$basearch/
gpgcheck=0
[wupdates]
name=CentOS-$releasever - Updates Wandoulabs
baseurl=http://mirrors.internal.nosa.me/centos/$releasever/updates/$basearch/
gpgcheck=0

[wextras]
name=CentOS-$releasever - Extras Wandoulabs
baseurl=http://mirrors.internal.nosa.me/centos/$releasever/extras/$basearch/
gpgcheck=0

[wcentosplus]
name=CentOS-$releasever - Plus Wandoulabs
baseurl=http://mirrors.internal.nosa.me/centos/$releasever/centosplus/$basearch/
gpgcheck=0
enabled=0

[wcontrib]
name=CentOS-$releasever - Contrib Wandoulabs
baseurl=http://mirrors.internal.nosa.me/centos/$releasever/contrib/$basearch/
gpgcheck=0
enabled=0

[puppetlabs-products]
name=CentOS-$releasever - Puppetlabs Wandoulabs
baseurl=http://mirrors.internal.nosa.me/puppetlabs/$releasever/$basearch/puppetlabs-products
gpgcheck=0

[epel]
name=CentOS-$releasever - EPEL Wandoulabs
baseurl=http://mirrors.internal.nosa.me/epel/$releasever/$basearch/epel
gpgcheck=0

[wandoulabs]
name=CentOS-$releasesever - Wandoulabs
baseurl=http://mirrors.internal.nosa.me/wandoulabs/$releasever/$basearch/
gpgcheck=0

2.spec 文件

Summary: yum repository
Name: wandoulabs-release
Version: 0.0.13
Release: 1.el6
License: GPL 2 license

%description
This is the repository package

%prep
cp -rf $RPM_SOURCE_DIR/wandoulabs-release .
%build

%install
mkdir -p %{buildroot}
mkdir -p %{buildroot}/etc/yum.repos.d/
mkdir -p %{buildroot}/etc/pki/rpm-gpg/wandoulabs/
cp wandoulabs-release/wandoulabs.repo %{buildroot}/etc/yum.repos.d/wandoulabs.repo

%preun

%files
/etc/yum.repos.d/wandoulabs.repo

3.使用 rpmbuild -bb 打包,然后把 rpm 放入自建仓库中。


使用自建仓库

1.把现有 repo 文件删除

rm /etc/yum.repo.d/*

2.安装自建仓库的 rpm 包。

3.清理环境( yum clean all )后就可以正常使用


自建仓库自动化管理

在系统自动化安装时,会把这个 wandoulabs-relase 包安装上,之后该包会进入 puppet 的管理范围,保持最新的 wandoulabs-release 包。

如果有新的仓库需要添加, 同步完仓库后,将新的 mirror 仓库路径加入配置,打包一个新版本的 wandoulabs-release 包,放入自建仓库中,各服务器会自动更新仓库包。

构建机房运维基础架构(十一): 搭建NAT服务

本文档介绍如何在一台服务器做NAT转发,以外网网卡是em1 ,源IP段10.0.0.0/16 为例。


1.开启forward ,并加入开机启动

# sysctl -w net.ipv4.ip_forward=1
# echo “sysctl -w net.ipv4.ip_forward=1” >> /etc/rc.d/rc.local

2.增加外网IP。

外网出口可以有多个IP,先增加这些IP (不配置的話NAT不生效)。

来个例子脚本( 执行而且把这段脚本写入/etc/rc.d/rc.local ):

ip_prefix=“121.14.25”
ip_min=131
ip_max=158
netmask=“255.255.255.224”

n=0
for i in `seq $ip_min $ip_max`
do
    /sbin/ifconfig em1:$n ${ip_prefix}.$i netmask $netmask up
    ((n++))
done

3.用iptables 增加nat 转发

类似:

# iptables -t nat -A POSTROUTING -s 10.0.0.0/16 -o em1 -j SNAT –to-source 121.14.25.17-121.14.25.22
# iptables-save > /etc/sysconfig/iptables

如果不指定出口IP,可以用:

# iptables -t nat -A POSTROUTING -s 10.0.0.0/16 -o em1 -j MASQUERADE

另外两点:

  1. 最好要两台NAT机器(接入一台交换机),起一个VIP指向这两台机器,并且在接入交换机上打开 源IP、源端口、目的IP、目的端口 的哈希功能(在等价路由基础上),这其实是实现了流量的负载均衡和高可用(具体咨询搞网络的同学)。

  2. 最好有安全策略,不要让所以机器都可以通过NAT访问外网,这个功能自己去调研方案啦。

构建机房运维基础架构(十): 如何实现Nginx和程序的100%无损发布

我们的负载均衡架构是这样的:

请求 —> 网络 —> LVS集群 —> Nginx 集群 —> APP

这里,LVS、Nginx 和APP(后端程序) 都需要发布,LVS和 Nginx 一般是修改配置文件,APP则是程序更新。对于LVS,我们是用模板生成配置,然后reload,reload 的时候LVS会把当前请求继续处理完,而且LVS改的频率较小,所以问题不大。

主要看一下Nginx 和 APP 如何做到100%无损发布,我觉得理想的方式是发布Nginx 的时候把Nginx 从LVS上T掉,发布APP 的时候从Nginx上把 APP T掉,T掉通过「健康检查」的方式,而不是修改配置reload 。

 

Nginx发布

事实上,LVS支持 HTTP 的检查方式,我们只要在 Nginx 端 创建一个专门用于检测的文件。

LVS的 HTTP_GET 指令用于实现HTTP CHECK,解释如下:

HTTP_GET: Working at layer5. Performs a GET HTTP to a specified URL. The get result is
then summed using the MD5 algorithm. If this sum does not match with the expected value,
the test is wrong and the server is removed from the server pool. This module implements a
multi-URL get check on the same service. This functionality is useful if you are using a server
hosting more than one application server. This functionality gives you the ability to check if an
application server is working properly. The MD5 digests are generated using the genhash
utility (included in the keepalived package).

同样,LVS 支持 SSL_GET 的方式,用于 检查后端的 443 端口。

SSL_GET: Same as HTTP_GET but uses a SSL connection to the remote webservers. 

这里,我先配置Nginx,Nginx配置文件目录 是 /home/work/nginx/conf ,我把检查的配置写在了default配置里,LVS检查请求的Host 是 Nginx的内网IP,所以要保证没有其他配置文件的server_name 里面包含 Nginx内网IP。

server {
    listen 80 default_server;
    listen 443 ssl default_server;

    # Do not delete it, otherwise lvs http check will fail, it’s terrible!!!
    location /http_check/index.html {
        root /home/work/nginx/conf/;
        open_file_cache off;
    }

    location /nginx_status {
        stub_status on;
        access_log off;
        allow 10.0.0.0/8;
        deny all;
    }
}

在这里,我们用 open_file_cache off; 把文件缓存关掉,为了不让缓存影响 LVS 的检测;另外要注意,listen 443 的时候要启用 ssl,不然可能会有严重的问题,我遭受过惨烈的 教训

在Nginx 上:
cd /home/work/nginx/conf/

$ cat http_check/index.html

Do not change this file, otherwise lvs http check will fail, it’s terrible!!!

http check ok!

$ md5sum http_check/index.html
2a94d9d1703ca63c35b24fc7a41d89e1  http_check/index.html
在LVS上用 genbash 检查(10.19.29.3是Nginx IP):
$ genhash -s 10.19.29.3 -p 80 -u /http_check/index.html
MD5SUM = b4ec1928222cfee3512e328ad5c98be4

MD5之后的值要写在LVS配置文件里,如下:

delay_loop 6

real_server 10.19.29.3 80 {
weight 100
HTTP_GET(或者 SSL_GET) {
            url {
              path /http_check/index.html
              digest 2a94d9d1703ca63c35b24fc7a41d89e1
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
}
}

解释下下面三个指令的含义:
delay_loop :specify in seconds the interval between checks
nb_get_retry :maximum number of retries
delay_before_retry :delay between two successive retries

Nginx 的http_check/index.html 删掉之后,等待15s LVS就会把Nginx T掉了;同样 http_check/index.html 恢复之后,等15s 也足够了。

 

APP发布

Nginx 的健康检查我们用 ngx_http_upstream_check_module 模块来做, 文档(我们用的是Tengine):
http://tengine.taobao.org/document_cn/http_upstream_check_cn.html

用法类似:
upstream test-nodes {
server pxe0.hy01:8888;
server pxe1.hy01:8888;

    check interval=3000 rise=3 fall=2 timeout=1000 type=http port=1023;’
    check_keepalive_requests 100;
    check_http_send “HEAD / HTTP/1.1\r\nConnection: keep-alive\r\n\r\n”;
    check_http_expect_alive http_2xx http_3xx;
}

check_keepalive_requests 指令表示一共连接检查多少次之后关闭,默认是 1,所以改大点比较好(但是我在线上配置的时候发现没有这个指令 !! )。

我们可以在后端APP(比如pxe0.hy01 和 pxe1.hy01 ) 起一个单独的服务,端口 1023 ,专门用作健康检查,检查失败Nginx 即把后端机器 T掉。

这个服务越轻量越稳定越好,甚至可以用精简版Nginx ,虽然看起来很挫,但很work。

另外要注意的两点:

1.如果后端用 lighttpd 做检测,check_http_send 需要加 Host,因为 lighttpd 对长连接要求有 Host 头(HTTP1.1 规范,不知道 Nginx 是否也是这样),不然报 400 bad request ,check_http_send 可以这么写:

     check_http_send “HEAD / HTTP/1.1\r\nConnection: keep-alive\r\nHost:nginx.check\r\n\r\n”;

自己把 nginx.check 替换成想要的 Host 头就行了。

2.我在把这段配置正式上线的时候遇到了一个坑,导致线上所有服务都挂了一下,我在加上配置 reload 的时候 Nginx 开始启用新检查方式,而在新的检查方式成功之前,Nginx 认为后端都是不可用的,会报  502 Bad Gateway ,好惨烈的坑,所以最佳方式是 先 stop 后 start 。