如何自动化的生成 Nginx 配置文件

本文讨论如何自动化的生成 Nginx 配置文件,Nginx 配置文件指的是 server 的配置,这里有一个很重要的概念,就是:服务树,我们希望基于服务树来维护 server 配置需要的信息。

 

服务树的每一个节点就是一个服务,那么,我们对每个节点定义必要的信息,包括:

node_id – 节点 id,代表服务;

domain_uris – 代表服务绑定的域名和路径,支持多个,因为一个服务可能同时需要绑定外网域名和内网域名,而且有绑定多个路径的需求,它的格式如下:

[{‘domain_id’: domain_id, ‘uri’: uri }, …] ;

upstream node name – 这个服务的 upstream 名称;

servers – node_id 下绑定的机器列表(每台机器可以绑定不同的权重,以实现流量控制);

port – 这个服务监听的端口;

ip_hash – 是否对 upstream 启用 ip hash。

 

上面的 domain_id 表示域名信息,事实上域名信息包括:

domain – 域名;

ports – 端口,可以包含多个端口,并且支持是否开启 ssl;

access_log_path – 正常日志路径,默认为 ${domain}_access.log;

error_log_path – 错误日志路径,默认为 ${domain}_error.log;

ssl_cert_path – 证书文件路径,如果 ports 中没有开启 ssl,此处可以留空;

ssl_cert_key_path – 私钥文件路径,如果 ports 中没有开启 ssl,此处可以留空;

要注意的一点,如果 ssl 文件配置在 server 中,如果客户端不支持 SNI,ssl 连接可能会失败,这里我们不讨论多个域名证书不放在 server 中的配置问题。

生成配置文件基于模板,很简单,不过要注意的是,location $uri 有顺序要求,只要能保证按照 uri 的长度从高到低就没问题了。

 

自动生成配置文件的好处:

1. 在页面上点点就能增加、修改或删除服务的 Nginx 配置,比较方面,而且彻底解决了使用 git 管理配置带来的各种 rewrite 、if 等冗长的配置问题;

2. 可以基于服务做可用率的报警,根据服务可以查到 domain 和 path,然后过滤 Nginx 日志来计算可用率。而且当服务出问题的时候可以查看到服务的每台机器的可用率状况,然后做出自动剔除机器的动作。

构建机房运维基础架构(二): 自动装机系统原理

接着上篇(机房装机环境搭建),说说实现一个自动装机系统的原理,实际上我的理想的装机方式是能够把一个裸机房(只有网络,没有任何已经安装好的机器)所有的机器都通过远程的方式安装起来,而不用先手动在本机房安装一台”安装服务器”,要做到这一点,需要把本机房和远程机房控制卡网络和机器内网都打通,让本机房的机器上架之后控制卡网卡可以从远程机房的DDNS获取IP,内网网卡可以通过远程机房的DHCP获取IP,如此即可。豌豆荚现在只打通了内网,控制卡网没有打通,这是后续可以做的,其实这很牛逼的。

我们用的机器基本上是DELL的,所以本文介绍一下DELL服务器自动装机的原理,这里所说的自动装机指的是 服务器上架之后,通过机器的SN 来装机的过程,单机安装不到10分钟时间,工程师只需要点一下鼠标。

首先我们买的机器有一个出厂设置,最主要的是控制卡的网络要设置成DHCP,我们在机房搭建了DDNS服务,控制卡通过DDNS来获取IP,同时控制卡DHCP的时候会带上主机名(格式是:idrac-SN),所以DDNS也会记录下主机名和IP的映射关系。这样,机器上架后我们就可以通过SN 来解析到控制卡的IP了,这是自动装机的基础。

这里假设从第二块网卡装机(内网)。

 

装机过程:

1.拿到机器控制卡 IP (ddns) 和 密码

 

2.检查SN (控制卡ip是用sn从DDNS获取的,连上控制卡之后检查下sn是不是对的,为了安全嘛)

 

3.拿到网卡信息

(先ssh root@控制卡IP 后 再执行下面命令)

/admin1-> racadm get NIC.NICConfig
NIC.NICConfig.1 [Key=NIC.Integrated.1-1-1#NICConfig]
NIC.NICConfig.2 [Key=NIC.Integrated.1-2-1#NICConfig]
NIC.NICConfig.3 [Key=NIC.Integrated.1-3-1#NICConfig]
NIC.NICConfig.4 [Key=NIC.Integrated.1-4-1#NICConfig]

如果从第二块网卡装机,那么拿到的是 NIC.Integrated.1-2-1

还有一种网卡叫 NIC.Embedded,那么第二块网卡是 NIC.Embedded.2-1-1

 

4.设置启动顺序

如果 用 NIC.Integrated.1-2-1  ,启动顺序设置成HardDisk.List.1-1,NIC.Integrated.1-2-1

查看用:

racadm get BIOS.BiosBootSettings.BootSeq

设置启动顺序用:

racadm set BIOS.BiosBootSettings.BootSeq HardDisk.List.1-1,NIC.Integrated.1-2-1

生效:
(我发现有的机器不需要执行这步,只执行上一个命令就行,难道是版本的问题 或者 ?)
(增加 jobqueue,让设置重启生效(因为重启和设置需要挺长时间,最好sleep一段时间 。)

racadm jobqueue delete –all

racadm jobqueue create BIOS.Setup.1-1 -r pwrcycle -s TIME_NOW

sleep 600

另外,看jobqueue 可以用 命令  racadm jobqueue view

 

5.设置第二块网卡支持PXE启动

下面是可以参考的一个函数:

def enable_nic_pxe(self, nic):
    if nic == "NIC.Embedded.2-1-1":
        cmd1 = r"racadm set NIC.NICConfig.2.LegacyBootProto PXE"
        cmd2 = r"racadm jobqueue create NIC.Embedded.2-1-1 -r pwrcycle -s TIME_NOW"
    elif nic == "NIC.Embedded.1-1-1”:
        cmd1 = r"racadm set NIC.NICConfig.1.LegacyBootProto PXE"
        cmd2 = r"racadm jobqueue create NIC.Embedded.1-1-1 -r pwrcycle -s TIME_NOW"
    elif nic == "NIC.Integrated.1-2-1":
        cmd1 = r"racadm set NIC.NICConfig.2.LegacyBootProto PXE"
        cmd2 = r"racadm jobqueue create NIC.Integrated.1-2-1 -r pwrcycle -s TIME_NOW"
    elif nic == "NIC.Integrated.1-1-1":
        cmd1 = r"racadm set NIC.NICConfig.1.LegacyBootProto PXE"
        cmd2 = r"racadm jobqueue create NIC.Integrated.1-1-1 -r pwrcycle -s TIME_NOW"
    else:
        return "nic not support"

    cmd = r"racadm jobqueue delete --all"
    self.ssh_cmd(cmd)
    self.ssh_cmd(cmd1)
    self.ssh_cmd(cmd2)

    time.sleep(600)

cmd1 命令是设置;

cmd2 是增加 jobqueue,让设置立即重启生效

 

6.设置系统从PXE启动一次

racadm config -g cfgServerInfo -o cfgServerBootOnce 1

racadm config -g cfgServerInfo -o cfgServerFirstBootDevice PXE

 

7.重启

racadm serveraction powercycle

 

8.拷贝ks配置文件(为了避免手动输入; 装完之后要记得删除ks文件)

拿到第二块网卡的MAC地址

/admin1-> racadm getsysinfo -s

System Information:
System Model            = PowerEdge R720xd
System Revision         = I
System BIOS Version     = 2.1.3
Service Tag             = 5NK6G02
Express Svc Code        = 12308526722
Host Name               =
OS Name                 =
OS Version              =
Power Status            = ON
Fresh Air Capable       = Yes

Embedded NIC MAC Addresses:
NIC.Integrated.1-3-1    Ethernet                = F8:BC:12:34:E9:EE
WWN                     = F8:BC:12:34:E9:EE
NIC.Integrated.1-4-1    Ethernet                = F8:BC:12:34:E9:EF
WWN                     = F8:BC:12:34:E9:EF
NIC.Integrated.1-1-1    Ethernet                = F8:BC:12:34:E9:EC
WWN                     = F8:BC:12:34:E9:EC
NIC.Integrated.1-2-1    Ethernet                = F8:BC:12:34:E9:ED
WWN                     = F8:BC:12:34:E9:ED

把ks 配置文件 拷贝到 pxelinux.cfg 目录下,名称是处理后的MAC地址,比如:

F8:BC:12:34:E9:ED

====>

01-f8-bc-12-34-e9:ed

处理方式是 把 冒号 换成 – ,大写换成小写,前面加上 01-

 

目前装机系统没有页面,只有 API,我们通过 Jenkins 调用,界面如下:

f01f53c9-3401-4c1b-9431-00941d615e79