日均百万PV架构第五弹(运维自动化)

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介:

概念:
    puppet基于ruby的开源自动化部署工具
    具有可测试性,强一致性部署体验
    丰富资源定义完成系统配置全周期流程
    内置丰富编程体验完成自主任务
    资源标识与通知机制特性

    puttet服务器端定义客户端节点所需资源类型,客户端加入部署环境后,
    客户端凭借主机名等申请(https)对应服务器资源,服务器编译catelog
    后将结果返回客户端,客户端利用这些信息完成系统资源的定义与处理,
    并返回结果给服务器.

wKioL1N8tiHxM_drAAJs-3mx82I085.jpg


规划:
    172.16.43.200 master.king.com (预装 puppet server)
    172.16.43.1   slave1.king.com (预装 puppet agent再无其他资源) 

    按照之前架构,这次演示slave1.king.com的自动化安装,其他节点的安装配置以附件形式上传


针对slave1.king.com部署实现
    -> puppet agent 软件(由cobbler预装)

    -> hosts 文件(puppet自动化)

    -> bind 软件及配置文件(puppet自动化)

    -> haproxy 软件及配置文件(puppet自动化)

    -> keepalived 软件及配置文件


本地测试阶段(master.king.com)

在master节点编写模块,测试通过后进行主从方式的配置

1
2
# 安装puppet
yum -y  install  puppet-2.7.23-1.el6.noarch.rpm

    1.在/etc/puppet目录建立如下目录

1
2
mkdir  /etc/puppet/manifest/ {haproxy,hosts,keepalived,named}/{files,manifests,templates} -pv
mkdir  /etc/puppet/modules

    wKiom1N8utmSxRGpAAGuJUM-zQo936.jpg

wKiom1N8u9ryOpV8AAJmytpmzVM316.jpg

    2.编辑/etc/puupet/manifests/hosts/files/hosts (host)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 若要部署成前四节的架构,这里需要把每一个点都自动化所以配置文件及其对应的软件都要安装配置
 
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
172.16.43.1 slave1.king.com
172.16.43.2 slave2.king.com
172.16.43.3 slave3.king.com
172.16.43.4 slave4.king.com
 
172.16.43.3 imgs1.king.com
172.16.43.3 imgs2.king.com
172.16.43.3 text1.king.com
172.16.43.3 text2.king.com
172.16.43.3 dynamic1.king.com
172.16.43.4 dynamic2.king.com
 
172.16.43.200 master.king.com
172.16.43.6 server.king.com
172.16.43.5 proxy.king.com

   编辑/etc/puupet/manifests/hosts/files/init.pp, 这是hosts的模块定义

1
2
3
4
5
6
7
8
9
10
11
12
# hosts 的 init.pp
 
# 自动定义资源模块名为hosts
# hosts 不需要安装软件仅仅是将hosts文件在master/slave模型下复制到slave的某目录中
# 所以这里定义的资源类型只有 file
class hosts {
     file  "hosts"  :
         ensure =>  file ,
         source  =>  "puppet:///modules/hosts/hosts" ,
         path =>  "/etc/hosts"
     }
}

    3. 之后配置都如(2)类型配置,代码文件分别为配置文件和模块定义文件 (named)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
//  named.conf
 
options {
//     listen-on port 53 { 127.0.0.1; };
//     listen-on-v6 port 53 { ::1; };
     directory      "/var/named" ;
     dump- file      "/var/named/data/cache_dump.db" ;
         statistics- file  "/var/named/data/named_stats.txt" ;
//         memstatistics- file  "/var/named/data/named_mem_stats.txt" ;
     allow-query     { 172.16.0.0 /16 ; };
     recursion  yes ;
 
     dnssec- enable  yes ;
     dnssec-validation  yes ;
     dnssec-lookaside auto;
 
     /* Path to ISC DLV key */
     bindkeys- file  "/etc/named.iscdlv.key" ;
 
     managed-keys-directory  "/var/named/dynamic" ;
};
 
logging {
         channel default_debug {
                 file  "data/named.run" ;
                 severity dynamic;
         };
};
 
zone  "."  IN {
     type  hint;
     file  "named.ca" ;
};
 
include  "/etc/named.rfc1912.zones" ;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
//  named.rfc1912.zones:
 
zone  "localhost.localdomain"  IN {
     type  master;
     file  "named.localhost" ;
     allow-update { none; };
};
 
zone  "localhost"  IN {
     type  master;
     file  "named.localhost" ;
     allow-update { none; };
};
 
zone  "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa"  IN {
     type  master;
     file  "named.loopback" ;
     allow-update { none; };
};
 
zone  "1.0.0.127.in-addr.arpa"  IN {
     type  master;
     file  "named.loopback" ;
     allow-update { none; };
};
 
zone  "0.in-addr.arpa"  IN {
     type  master;
     file  "named.empty" ;
     allow-update { none; };
};
 
zone  "king.com"  IN {
     type  master;
     file  "king.com.zone" ;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
# king.com.zone
 
$TTL 600
@    IN    SOA    dns.king.com.    adminmail.king.com. (
             2014050401
             1H
             5M
             3D
             12H )
     IN    NS    dns
dns    IN    A    172.16.43.1
www    IN    A    172.16.43.88
www    IN    A    172.16.43.188
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# named 的 init.pp
 
# 定义模块named , dns软件报名为bind,所以package是安装bind软件借助yum源
class named {
     package {  "bind" :
         ensure => present,
         name =>  "bind" ,
         provider => yum,
     }
 
     # named 软件要运行起来需要配置区域文件并且要求改变属主属组
     file  "/etc/named.conf" :
         ensure =>  file ,
         require => Package[ "bind" ],
         source  =>  "puppet:///modules/named/named.conf" ,
         owner => named,
         group => named,
     }
 
     file  "/etc/named.rfc1912.zones" :
         ensure =>  file ,
         require => Package[ "bind" ],
         source  =>  "puppet:///modules/named/named.rfc1912.zones" ,
         owner => named,
         group => named,
     }
 
     file  "/var/named/king.com.zone" :
         ensure =>  file ,
         require => Package[ "bind" ],
         source  =>  "puppet:///modules/named/king.com.zone" ,
         owner => named,
         group => named,
     }
 
     # bind软件在package安装了之后,需要启动并设置开启启动,但前提是package已经帮我们装好的bind软件
     service {  "named" :
         ensure =>  true ,
         require => Package[ "bind" ],
         enable  =>  true ,
     }
}

    4. haproxy的配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# /etc/haproxy/haproxy.cfg
 
global
     log         127.0.0.1 local2
     chroot       /var/lib/haproxy
     pidfile      /var/run/haproxy .pid
     maxconn     4000
     user        haproxy
     group       haproxy
     daemon
 
defaults
     mode                    http
     log                     global
     option                  httplog
     option                  dontlognull
     option http-server-close
     option forwardfor       except 127.0.0.0 /8
     option                  redispatch
     retries                 3
     timeout http-request    10s
     timeout queue           1m
     timeout connect         10s
     timeout client          1m
     timeout server          1m
     timeout http-keep-alive 10s
     timeout check           10s
     maxconn                 30000
 
listen stats
     mode http
     bind 0.0.0.0:8080
     stats  enable
     stats hide-version
     stats uri      /haproxyadmin ?stats
     stats realm   Haproxy\ Statistics
     stats auth    admin:admin
     stats admin  if  TRUE
 
frontend http- in
     bind *:80
     mode http
     log global
     option httpclose
     option logasap
     option dontlognull
     capture request  header Host len 20
     capture request  header Referer len 60
     acl img_static     path_beg    -i  /images  /imgs
     acl img_static     path_end    -i .jpg .jpeg .gif .png
     acl text_static     path_beg    -i /  /static  /js  /css
     acl text_static     path_end    -i .html .shtml .js .css
 
     use_backend img_servers         if  img_static
     use_backend text_servers         if  text_static
     default_backend dynamic_servers
 
backend img_servers
     balance roundrobin
     server imgsrv1 imgs1.king.com:6081 check maxconn 4000
     server imgsrv2 imgs2.king.com:6081 check maxconn 4000
 
backend text_servers
     balance roundrobin
     server textsrv1 text1.king.com:6081 check maxconn 4000
     server textsrv2 text2.king.com:6081 check maxconn 4000
 
backend dynamic_servers
     balance roundrobin
     server websrv1 dynamic1.king.com:80 check maxconn 1000
     server websrv2 dynamic2.king.com:80 check maxconn 1000
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# haproxy 的 init.pp
 
class haproxy {
     package {  "haproxy" :
         ensure => present,
         name =>  "haproxy" ,
         provider => yum,
     }
 
     file  "/etc/haproxy/haproxy.cfg" :
         ensure =>  file ,
         require => Package[ "haproxy" ],
         source  =>  "puppet:///modules/haproxy/haproxy.cfg" ,
     }
 
     service {  "haproxy" :
         ensure =>  true ,
         require => Package[ "haproxy" ],
         enable  =>  true ,
     }
}

    5. keepalived的配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# /etc/keepalived/keepalived.conf
 
global_defs {  
     notification_email {  
         root@localhost
     }  
     notification_email_from keepadmin@localhost
     smtp_connect_timeout 3  
     smtp_server 127.0.0.1  
     router_id LVS_DEVEL_KING
}  
 
vrrp_script chk_haproxy {  
     script  "/etc/keepalived/chk_haproxy.sh"  
     interval 2
     weight 2  
}  
 
vrrp_instance VI_1 {  
     interface eth0  
     state MASTER   # BACKUP for slave routers
     priority 100   # 99 for BACKUP
     virtual_router_id 173
     garp_master_delay 1 
   
     authentication {  
         auth_type PASS  
         auth_pass king1
     }  
     track_interface {  
         eth0    
     }  
     virtual_ipaddress {  
         172.16.43.88 /16  dev eth0
     }  
     track_script {  
         chk_haproxy
     }
}
 
vrrp_instance VI_2 {  
     interface eth0  
     state BACKUP   # master for slave routers
     priority 99   # 99 for master
     virtual_router_id 174
     garp_master_delay 1 
   
     authentication {  
         auth_type PASS  
         auth_pass king2
     }  
     track_interface {  
         eth0    
     }  
     virtual_ipaddress {  
         172.16.43.188 /16  dev eth0
     }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# keepalived 的 init.pp
 
class keepalived {
     package {  "keepalived" :
         ensure => present,
         name =>  "keepalived" ,
         provider => yum,
     }
 
     file  "/etc/keepalived/keepalived.conf" :
         ensure =>  file ,
         require => Package[ "keepalived" ],
         source  =>  "puppet:///modules/keepalived/keepalived.conf" ,
         notify => Exec[ "reload" ],
     }
 
     service {  "keepalived" :
         ensure =>  true ,
         require => Package[ "keepalived" ],
         enable  =>  true ,
     }
 
     exec  "reload" :
         command  =>  "/usr/sbin/keepalived reload" ,
         subscribe => File[ "/etc/keepalived/keepalived.conf" ],
         path =>  "/bin:/sbin:/usr/bin:/usr/sbin" ,
         refresh =>  "/usr/sbin/keepalived reload" ,
     }
}

    6. 一切定义完毕进入测试

# 首先所有的包都没有安装

wKioL1N8wM3jgQE2AAKyLrLgI8Q650.jpg

# 使用puppet apply -e 命令在master节点测试安装hosts模块前后 /etc/hosts 文件的变化情况

wKiom1N8wPqR1TKHAAbqOnZ684E637.jpg

# 其余模块一次测试 , 

wKioL1N8wQHC8oG_AAmElnnk3rc685.jpg

# 观察keepalived的启动效果,在配置文件中定义的vrrp已经出现

wKioL1N8wTaxLXb1AASZjjDVQoA719.jpg

# 观察服务端口是否均已启动

wKiom1N8wWOiFzaDAAWZgmuniRA712.jpg

# 本地测试没有异常的情况下,现在考虑将slave1.king.com之前内容情况后,利用puppet自动化部署slave1.king.com节点所需的软件和配置


master/slave测试

puppet master:
    1, 安装puppet-server并配置,启动服务
    yum -y install puppet-server-2.7.23-1.el6.noarch.rpm
    puppet master --genconfig >> /etc/puppet/puppet.conf
    service puppetmaster start

puppet agent:
    1、安装puppet客户端并配置,启动服务
    yum -y install puppet-2.7.23-1.el6.noarch.rpm
    vim /etc/puppet/puppet.conf,在[agent]中添加server=master.king.com
    service puppet start


# 在master/slave服务启动后,slave1节点会发出请求查询,master会从site.pp文件中查找slave1.king.com该装什么模块

1
2
3
4
5
6
7
8
9
10
11
# /etc/puppet/modules/site.pp
 
# 这里就是表示slave1将安装named,keepalived,haproxy,hosts等文件
# 当然之前写过的模块还有这里的节点都可以按照面向对象编程里的class一样
# 带有继承关系的
node  'slave1.king.com'  {
         include named
         include keepalived
         include haproxy
         include hosts
}


在master/slave服务启动后,agent会根据配置文件中server的位置发起调用安装配置的请求,这才服务器需要将请求签证

# 已达到安全传输的目的

签署证书:
    master:
        puppet cert list  # 查看所有的客户端的签证请求
        puppet cert sign --all  # 签署所有请求,那么客户端与服务器就可以进行交互了

wKioL1N8x1jC7ZadAAMy5xsSI9k251.jpg

# 在稍等片刻后,这些节点将被自动的在slave1.king.com上完成部署,当然也可以手动进行

1
2
# slave1.king.com
puppet agent -t

# 手动去请求服务器应用完毕的结果

wKioL1N8yyHBUf1cAAHUq2QwQDg759.jpg

# 部署完毕后vrrp节点信息,此时仅仅部署了一个slave1节点,所以会有两个vrrp的ip地址,详见keepalived的配置文件

wKiom1N8y0ygydbvAATeNN0DNnQ430.jpg

# slave1上自动部署完成后的服务端口信息

wKiom1N8y02DPBSMAAZONMnNQKg772.jpg




     本文转自My_King1 51CTO博客,原文链接:http://blog.51cto.com/apprentice/1415003,如需转载请自行联系原作者



目录
打赏
0
0
0
0
347
分享
相关文章
XJ-Survey:这个让滴滴日均处理1.2亿次问卷请求的开源系统,今天终于公开了它的架构密码!
嗨,大家好,我是小华同学。今天为大家介绍一款由滴滴开源的高效调研系统——XJ-Survey。它功能强大,支持多类型数据采集、智能逻辑编排、精细权限管理和数据在线分析,适用于问卷、考试、测评等场景。采用 Vue3、NestJS 等先进技术栈,确保高性能与安全性。无论是企业还是个人,XJ-Survey 都是你不可错过的神器!项目地址:[https://github.com/didi/xiaoju-survey](https://github.com/didi/xiaoju-survey)
56 15
神经架构搜索:自动化设计神经网络的方法
在人工智能(AI)和深度学习(Deep Learning)快速发展的背景下,神经网络架构的设计已成为一个日益复杂而关键的任务。传统上,研究人员和工程师需要通过经验和反复试验来手动设计神经网络,耗费大量时间和计算资源。随着模型规模的不断扩大,这种方法显得愈加低效和不够灵活。为了解决这一挑战,神经架构搜索(Neural Architecture Search,NAS)应运而生,成为自动化设计神经网络的重要工具。
自动化运维的利剑:Ansible在现代IT架构中的应用
在数字化浪潮中,企业对IT系统的敏捷性和可靠性要求日益提高。Ansible,一种简单但强大的自动化运维工具,正成为现代IT架构中不可或缺的一部分。它通过声明式编程语言YAM,简化了系统配置、应用部署和任务自动化的过程,显著提升了运维效率和准确性。本文将深入探讨Ansible的核心特性、应用场景以及如何有效整合进现有IT环境,为读者揭示其在自动化运维中的实用价值和未来发展潜力。
自动化运维的利剑:Ansible在现代IT架构中的应用
【10月更文挑战第42天】本文旨在揭示自动化运维工具Ansible如何革新现代IT架构,通过简化配置管理和部署流程,提升效率和可靠性。我们将探索Ansible的核心功能、语言特性以及其在DevOps文化中的角色。文章还将展示如何借助Ansible构建模块化和可重用的配置代码,实现快速迭代与部署,并确保系统一致性。通过阅读本文,运维人员将了解如何利用Ansible优化日常任务,加速产品上线速度,同时提高系统的稳健性。
69 5
Serverless架构通过提供更快的研发交付速度、降低成本、简化运维、优化资源利用、提供自动扩展能力、支持实时数据处理和快速原型开发等优势,为图像处理等计算密集型应用提供了一个高效、灵活且成本效益高的解决方案。
Serverless架构通过提供更快的研发交付速度、降低成本、简化运维、优化资源利用、提供自动扩展能力、支持实时数据处理和快速原型开发等优势,为图像处理等计算密集型应用提供了一个高效、灵活且成本效益高的解决方案。
124 1
探索DevOps实践:利用Docker与Kubernetes实现微服务架构的自动化部署
【10月更文挑战第18天】探索DevOps实践:利用Docker与Kubernetes实现微服务架构的自动化部署
142 2
Serverless架构通过提供更快的研发交付速度、降低成本、简化运维、优化资源利用、提供自动扩展能力、支持实时数据处理和快速原型开发等优势,为图像处理等计算密集型应用提供了一个高效、灵活且成本效益高的解决方案。
Serverless架构通过提供更快的研发交付速度、降低成本、简化运维、优化资源利用、提供自动扩展能力、支持实时数据处理和快速原型开发等优势,为图像处理等计算密集型应用提供了一个高效、灵活且成本效益高的解决方案。
96 3
|
4月前
|
高效运维:从基础架构到自动化管理的全面指南
【10月更文挑战第11天】 本文将深入探讨如何通过优化基础架构和引入自动化管理来提升企业IT运维效率。我们将从服务器的选择与配置、存储解决方案的评估,到网络的设计与监控,逐一解析每个环节的关键技术点。同时,重点讨论自动化工具在现代运维中的应用,包括配置管理、持续集成与部署(CI/CD)、自动化测试及故障排除等方面。通过实际案例分析,展示这些技术如何协同工作,实现高效的运维管理。无论是IT初学者还是经验丰富的专业人员,都能从中获得有价值的见解和实操经验。
150 1
智能运维在现代IT架构中的转型之路####
【10月更文挑战第29天】 本文旨在探讨智能运维(AIOps)如何成为现代IT架构不可或缺的一部分,通过分析其核心价值、关键技术及实践案例,揭示AIOps在提升系统稳定性、优化资源配置及加速故障响应中的关键作用。不同于传统运维模式的被动响应,智能运维强调预测性维护与自动化处理,为企业数字化转型提供强有力的技术支撑。 ####
114 0
架构升级的救星!流量回放自动化测试的必备指南
大家好,我是小米,一名29岁的技术宅。今天分享一个物联网领域的实用技能——流量回放自动化测试。系统重构后,测试工作量巨大,本文介绍如何通过日志收集和数据回放进行自动化测试,包括离线、实时和并行回放模式,帮助快速定位Bug,提升测试效率和系统稳定性。欢迎关注我的微信公众号“软件求生”,获取更多技术干货!
110 3

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等