一、服务器角色
二、部署ansible
1、ansible简介
ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。主要包括:
(1)、连接插件connection plugins:负责和被监控端实现通信;
(2)、host inventory:指定操作的主机,是一个配置文件里面定义监控的主机;
(3)、各种模块核心模块、command模块、自定义模块;
(4)、借助于插件完成记录日志邮件等功能;
(5)、playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务。
2、ansible的优点
简单易用,学习门槛低、问题少、安装快、执行快,可进行批量命令和模块扩展,操作完全依赖 SSH 而不需要安装 agent。Ansible 结合 Docker、Mesos、Puppet、Vagrant、Git 等系统可以构建出非常好的自动化运维平台。
3、ansible的缺点
简单的设计从而导致没有依赖管理功能,另外当被管理的服务器达到一定数量时,执行效率会大大降低。
4、安装过程
ansible的安装包需从互联网上下载,即使用互联网yum源。
第一步,链接网址http://mirrors.163.com,点击右侧的centos帮助,下载centos6这个链接指向的文件,把下载的文件拷贝到/etc/yum.repos.d/目录下;
第二步,使用EPLE的yum源安装,语句为rpm -ivh epel-release-latest-6.noarch.rpm,然后查找当前目录下所有以rpm结尾的文件,并复制到/root/docs/ansible_rpm/下,语句为:
find -name '*rpm' -exec cp {} /root/docs/ansible_rpm/
第三步,在在联网的情况下,执行语句vim /etc/yum.conf,修改其中的配置文件keepcache=1,保存退出。然后执行下面的语句:
yum install -y ansible
安装的同时,RPM包也已下载到/var/yum目录下;
第四步,使用语句ansible --version查看是否安装成功,如果出现版本信息则安装成功。如果出现问题,则执行以下语句(需要rpm包):
yum install -y python-markupsafe
rpm -e ansible
rpm -ivh ansible*rpm
第五步,如果希望以后可以更加方便的安装,则可以将这些rpm包拷贝到自己创建的yum源中,用
createrepo .
创建一个索引,这样只要在/etc/yum.repo.d/下的repo文件中加入这个目录,这样就可以直接用yum语句安装、删除ansible包了。
5、创建工作目录
在需要的目录下创建目录ansible:
mkdir ansible
6、编写配置文件ansible.cfg
使用cd命令转到ansible目录下,vim配置文件ansible.cfg,内容如下:
[defaults]
inventory = hosts # 定义被管理主机的文件
remote_user = root # ssh到远程主机的用户
编写完成后,保存并退出。
7、编写主机清单文件hosts
vim主机清单文件hosts,即把被管理的服务器填入hosts文件中,并为其分组(一般写主机名不写ip地址),如:
[webservers]
yzy.bilibili.com
ljm.bilibili.com
[dbservers]
ccc.bilibili.com
[lvs]
twh.bilibili.com
8、利用ansible语句检查配置文件是否编写成功
执行临时命令ad-hoc,格式为:ansible主机 -m 模块 -a '选项',如:
ansible all -a 'id root'
该语句的意思为查看所有主机的root用户的id,如果没有指定模块则默认使用shell模块;
下面再来举个例子,如何分别列出hosts中webservers组的主机信息:
ansible all --list-hosts
如何列出所有组的主机信息:
ansible all --list-hosts
三、部署数据库服务器
1、mysql的简介
MySQL 是一个关系型数据库,由瑞典 MySQL AB 公司开发,目前属于 Oracle 旗下公司。MySQL 最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS (Relational Database ManagementSystem,关系数据库管理系统) 应用软件之一。MySQL 是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。MySQL 所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策(本词条"授权政策"),它分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库。由于其社区版的性能卓越,搭配 PHP ,Linux和 Apache 可组成良好的开发环境,经过多年的web技术发展,在业内被广泛使用的一种web服务器解决方案之一,称之为LAMP。
2、ansible-playbook配置思路
ansible配合使用mysql_db、mysql_user在客户端创建数据库、创建用户及配置主从。
3、mysql的优点
1.使用C和C++编写,并使用了多种编译器进行测试,保证源代码的可移植性;
2.支持AIX、FreeBSD、HP-UX、Linux、MacOS、NovellNetware、OpenBSD、OS/2 Wrap、Solaris、Windows等多种操作系统;
3.为多种编程语言提供了API。这些编程语言包括C、C++、Python、Java、Perl、PHP、Eiffel、Ruby和Tcl等;
4.支持多线程,充分利用CPU资源;
5.优化的SQL查询算法,有效地提高查询速度
6.既能够作为一个单独的应用程序应用在客户端服务器网络环境中,也能够作为一个库而嵌入到其他的软件中;
7.提供多语言支持,常见的编码如中文的GB 2312、BIG5,日文的Shift_JIS等都可以用作数据表名和数据列名;
8.提供TCP/IP、ODBC和JDBC等多种数据库连接途径;
9.提供用于管理、检查、优化数据库操作的管理工具;
10.支持大型的数据库。可以处理拥有上千万条记录的大型数据库;
11.支持多种存储引擎。
4、服务器授权远程主机访问
本地需要管理远程的一批服务器,主要执行以下任务:
(1) 将本地的文件复制到远端所有服务器;
(2) 需要在远程服务器中执行一个个命令;
使用copy模块,可以将本地文件一键复制到远程服务器; -a后跟上参数,参数中指定本地文件和远端路径;
ansible通过ssh登录到远程服务器后,并不执行.bash_profile来设置用户自定义的环境变量;如果我们需要管理的目标服务器的路径不同,就不能直接写绝对路径,也不能写变量替换的路径;
比如:针对服务器A的目标复制路径为 /opt/app/user1/bin ,服务器B的目标复制路径为/opt/app/user2/bin; 这两个路径在各自的服务器中的路径变量都设置为$bin; 但在copy模块中,我们不能直接使用dest = $bin/; 路径设置一般放在.bashrc /.bash_profile文件,但ansible模块登录后并不加载这两个文件;
解决方法: 针对这种情况,可以将dest路径设置为~/,都复制到用户目录,后续再通过远程脚本处理;
需要在远程执行一个个命令来管理远程服务器;
远程执行命令的模块有command、shell、scripts、以及raw模块;
command模块为ansible默认模块,不指定-m参数时,使用的就是command模块; comand模块比较简单,常见的命令都可以使用,但其命令的执行不是通过shell执行的,所以,像这些 "<",">", "|", and "&"操作都不可以,当然,也就不支持管道;示例:显示远程路径:
缺点:不支持管道,就没法批量执行命令;
使用shell模块,在远程命令通过/bin/sh来执行;所以,我们在终端输入的各种命令方式,都可以使用; 但是我们自己定义在.bashrc/.bash_profile中的环境变量shell模块由于没有加载,所以无法识别;如果需要使用自定义的环境变量,就需要在最开始,执行加载自定义脚本的语句;
5、部署mysql
如何通过ansible部署mysql呢?上面我们已经部署好ansible了,以下便是通过ansible部署mysql并起服务的介绍:
#我们都遵循装包-配置-起服务的规则,那么我们在写脚本的时候应该注意什么呢?开头的格式以’---’开行,第二行开始写脚本内容,整个脚本的名字,对应使用的hosts主机名,以及整个脚本要执行的任务有什么都要一一明细,如果不清楚步骤,那么通过ansible部署mysql的过程中就会遇到很多问题,比如文件目录找到,装包过程中丢包,对应的专用模块不对应,多一个空格或者少一个分号等等。
#首先明确装包装什么包,包之间有什么依赖关系,有什么优点等等。
第一步,利用装包特有的专属模块yum和item循环语句,item循环语句with_items:里面有要安装的所有包,state则表示要安装软件的版本转态。present和latest都表示最新版;
第二步,进行服务的配置:这里用到了 mysql_db:和mysql_user:板块来进行数据库的搭建和用户的创建管理,密码是:12345,对用户进行授权处理,在这里,我们对此数据库进行任何人可以访问,授权处理为:priv: 'yzybbs.*:ALL,GRANT',注意到这里我的hosts:’%’,这个%的意思是允许其人任何用户远程连接管理此数据库,并对此有执行权限;
第三步,启动mysql服务,就简单的写一个server板块,启动服务即可,启动服务了,但是我得判断mysql服务有没有启动成功,一般,如果mysql服务没有启动成功,可以通过查看错误日志的方式,日志默认路径/var/log/mysqld.log。
ansible-playbook代码如下:(3-deploy-mysql.yml)
---
- name: deploy mysql
hosts: dbservice
tasks:
- name: install pkgs
yum:
name: "{{ item }}"
state: present
with_items:
- mysql
- mysql-server
- MySQL-python
- name: start service
service:
name: mysqld
state: started
enabled: true
- name: Create a new database
mysql_db:
name: yzybbs
state: present
- name: create a new user
mysql_user:
name: yzy
host: '%'
password: 12345
priv: 'yzybbs.*:ALL,GRANT'
state: present
四、部署web服务器
1、通过ansible安装、起服务
---
- name: deploy web
hosts: webservice
tasks:
- name: install pkgs
yum:
name: "{{item}}"
state: present
with_items:
- httpd
- php
- php-mysql
- name: config
copy:
src: /root/B1_yzy/file/httpd.conf
dest: /etc/httpd/conf/httpd.conf
owner: root
group: root
mode: 0644
- name: start service
service:
name: httpd
state: started
enabled: true
第一行必须是以'---'开头,第二行开始写内容。'- name'是说明playbook的名字,起名字一定要清晰易懂,一个playbook可以有多个名字,即多个play(剧本);'hosts'的意思是所要执行命令的主机名所在的文件夹,一般使用主机名而不是ip地址,主机名可以有多个;'tasks'即该playbook所要执行的任务,一个play可以有多个tasks,本代码中可以看出一共有3个tasks(三个任务名'name')。
第一个任务是安装apache(httpd、php、php-mysql)。这里利用yum专有模块和item数组对多台主机的安装,item是数组,with_item是数组内容,state则表示要安装软件的版本转态。present和latest都表示最新版;第二个任务是拷贝文件'copy'。src表示源文件的路径,dest则是需要拷贝文件的主机名的路径,owner和group分别表示拥有对该源文件所有权限的用户和所属组,mode表示赋予所拷贝文件主机的权限;第三个任务是起服务。利用service专有模块对httpd开启服务,state表示对httpd的状态为开启,enabled表示一个判断命令,即service是否开启,true表示“是”。
2、将Discuz安装到web1上
以下是将Discuz.zip拷贝到web1(即ljm.bilibili.com)上并解压的代码:(2-install-discuz.yml)
---
- name: deploy ljm
hosts: ljm.bilibili.com
tasks:
- name: copy and unzip
unarchive:
src: /root/B1_yzy/file/Discuz.zip
dest: /var/yzy_web/
owner: apache
group: apache
本次操作的主机名是ljm.bilibili.com,利用unarchive的ansible专有模块对Discuz.zip的拷贝和解压缩,将本机的/root/B1_yzy/file/Discuz.zip压缩文件拷贝到ljm.bilibili.com主机的/var/yzy_web/下,权限所属的用户和组是apache。
3、将web1上的discuz拷贝到web2上
以下是将web1上的Discuz拷贝到web2(即yzy.bilibili.com)上代码:(4-deploy-otherweb.yml)
---
- name: synchronize bbs from ljm
hosts: ljm.bilibili.com
tasks:
- name: install rsync
yum:
name: rsync
state: present
- name: zip
shell:
cd /var/yzy_web/;
zip -r -q -o bbs.zip bbs
- name: pull bbs
synchronize:
src: /var/yzy_web/bbs.zip
dest: /root/B1_yzy/file/
mode: pull
- name: remove zip file
shell:
cd /var/yzy_web/;
rm -f bbs.zip;
- name: copy bbs to yzy
hosts: yzy.bilibili.com
tasks:
- name: copy bbs
unarchive:
src: /root/B1_yzy/file/bbs.zip
dest: /var/yzy_web
owner: root
group: root
该代码中有2个play:
第一个任务,将Discuz中的bbs文件夹压缩并备份到web2上,第一个任务是安装rsync,rsync是linux系统下的数据镜像备份工具。使用快速增量备份工具Remote Sync可以远程同步,支持本地复制,或者与其他SSH、rsync主机同步。present表示安装最新版本;
第二个任务,将Discuz中的bbs文件夹压缩的shell脚本,路径是/var/yzy_web/;第三个任务则是利用ansible中的synchronize专有模块将本机的源文件bbs.zip备份到另一台远程主机上的/root/B1_yzy/file/下,权限是pull;
第三个任务,先cd到/var/yzy_web/路径下然后将bbs.zip删除。第二个play任务是将远程主机上/var/yzy_web/路径下的bbs.zip拷贝到web2主机上。利用ansible中的unarchive专有模块将远程主机上的/root/B1_yzy/file/bbs.zip压缩包拷贝到web2主机上的/var/yzy_web路径下并解压缩然后自动删除,权限所属的用户和组都为root。
4、拷贝跳转路径文件
---
- name: let web jump
hosts: webservice
tasks:
- name: copy html
copy:
src: /root/B1_yzy/file/index.html
dest: /var/yzy_web/
owner: root
group: root
mode: 0644
这是跳转文件的文件内容:
<head>
<meta http-equiv="refresh" content="0;url=bbs">
</head>
hosts是webservice组中的主机,即web1和web2。任务是利用ansible中的copy专有模块将远程主机上的/root/B1_yzy/file/index.html文件拷贝到webservice组中的主机的/var/yzy_web/路径下,权限所属的用户和组都为root,权限是0644。
五、部署lvs调度器
1、LVS调度器
2、LVS特
可伸缩网络服务的几种结构,它们都需要一个前端的负载调度器(或者多个进行主从备份)。我们先分析实现虚拟网络服务的主要技术,指出IP负载均衡技术是在负载调度器的实现技术中效率最高的。在已有的IP负载均衡技术中,主要有通过网络地址转换(Network AddressTranslation)将一组服务器构成一个高性能的、高可用的虚拟服务器,我们称之为VS/NAT技术(Virtual Server via Network Address Translation)。在分析VS/NAT的缺点和网络服务的非对称性的基础上,我们提出了通过IP隧道实现虚拟服务器的方法VS/TUN (Virtual Server via IPTunneling),和通过直接路由实现虚拟服务器的方法VS/DR(Virtual Server via Direct Routing),它们可以极大地提高系统的伸缩性。VS/NAT、VS/TUN和VS/DR技术是LVS集群中实现的三种IP负载均衡技术。
3、工作模式
工作模式有四种:nat / tun / dr / fullna
4、工作特点
客户端不再直接访问后台应用服务器(real server),而是访问lvs调度器,调度器再根据它的调度算法将用户请求转发到real server。DR模式real server回应客户端,不用将回应发送到调度器。
5、调度算法
调度算法有10种,常用的是rr轮询/wrr加权轮询/lc最少连接/wlc加权最少连接,其他还有基于局部的最少连接lblc/带复制的基于局部的最少连接lblcr/源地址散列sh/目标地址散列dh/期望的最短延迟sed/最少队列调度nq
6、LVS优点
(1) 开源,免费;
(2)在网上能找到一些相关技术资源;
(3)具有软件负载均衡的一些优点。
7、LVS缺点
(1)最核心的就是没有可靠的支持服务,没有人对其结果负责;
(2)功能比较简单,支持复杂应用的负载均衡能力较差,如算法较少等;
(3)开启隧道方式需重编译内核;
(4)配置复杂;
(5)主要应用于LINUX,目前没有专门用于WINDOWS的版本,不过可以通过配置,使windows成为LVS集群中的real server(win2003、win2008中)。8、lvs部署安装
(1) 安装ipvsadm
yum -y install ipvsadm
检查安装:
ipvsadm -v
(2)在lvs调度器的物理网卡上配置vip
cd /etc/sysconfig/network-scripts/
cp ifcfg-eth0 ifcfg-eth0:1
vim ifcfg-eth0:0
DEVICE=eth0:0
BOOTPROTO=none
NETMASK=255.255.255.0
TYPE=Ethernet
IPADDR=172.16.100.8
ONBOOT=yes
启动网卡:
ifup eth0:0
(3)在web服务器的本地环回接口lo上配置vip
cp ifcfg-lo ifcfg-lo:0
vim ifcfg-lo:0
DEVICE=lo:0
IPADDR=172.16.100.8
NETMASK=255.255.255.255
NETWORK=192.168.16.240
BROADCAST=192.168.16.240
ONBOOT=yes
NAME=lo:0
启动本地环回接口lo:
ifup lo:0
(4)修改web服务器的内核参数,以便客户端发送的请求,只有调度器回应,注意,两台web服务器都要配置
sysctl -a | grep arp_ig
echo 'net.ipv4.conf.all.arp_ignore = 1'>> /etc/sysctl.conf
cho 'net.ipv4.conf.lo.arp_ignore = 1'>> /etc/sysctl.conf
echo 'net.ipv4.conf.all.arp_announce = 2'>> /etc/sysctl.conf
echo 'net.ipv4.conf.lo.arp_announce = 2'>> /etc/sysctl.conf
sysctl -p
(5)在lvs调度器上配置规则
ipvsadm -A -t 192.168.16.240:80 -s wrr
ipvsadm -a -t 192.168.16.240:80 -r192.168.16.254 -g -w 2
ipvsadm -a -t 192.168.16.240:80 -r192.168.16.249
ipvsadm -Ln
(6) 保存规则
service ipvsadm save
而用ansible-playbook怎么办呢
先部署lvs服务器:(6-deploy-lvs.yml)
---
- name: deploy lvs
hosts: lvs
tasks:
- name: install ipvsadm
yum:
name: ipvsadm
state: present
- name: copy vip
copy:
src: /root/B1_yzy/file/ifcfg-eth0:0
dest: /etc/sysconfig/network-scripts/
owner: root
group: root
mode: 0644
- name: deploy vip
shell:
ifup eth0:0
ipvsadm -A -t 172.16.100.8:80 -s wlc;
ipvsadm -a -t 172.16.100.8:80 -r 172.16.100.2;
ipvsadm -a -t 172.16.100.8:80 -r 172.16.100.5;
service ipvsadm save
再部署web,ansible代码如下:(7-deploy-webvip.yml)
---
- name: deploy web vip
hosts: webservice
tasks:
- name: copy vip
copy:
src: /root/B1_yzy/file/ifcfg-lo:0
dest: /etc/sysconfig/network-scripts/
owner: root
group: root
mode: 0644
- name: deploy vip
shell:
ifup lo:0;
echo 'net.ipv4.conf.all.arp_ignore = 1' >> /etc/sysctl.conf;
echo 'net.ipv4.conf.lo.arp_ignore = 1' >> /etc/sysctl.conf;
echo 'net.ipv4.conf.all.arp_announce = 2' >> /etc/sysctl.conf;
echo 'net.ipv4.conf.lo.arp_announce = 2' >> /etc/sysctl.conf;
sysctl -p;
六、配置DNS服务器
1、DNS域名解析系统
2、DNS功能
每个IP地址都可以有一个主机名,主机名由一个或多个字符串组成,字符串之间用小数点隔开。有了主机名,就不要死记硬背每台IP设备的IP地址,只要记住相对直观有意义的主机名就行了。这就是DNS协议的功能。
主机名到IP地址的映射有两种方式:
1)静态映射,每台设备上都配置主机到IP地址的映射,各设备独立维护自己的映射表,而且只供本设备使用;
2)动态映射,建立一套域名解析系统(DNS),只在专门的DNS服务器上配置主机到IP地址的映射,网络上需要使用主机名通信的设备,首先需要到DNS服务器查询主机所对应的IP地址。
通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析)。在解析域名时,可以首先采用静态域名解析的方法,如果静态域名解析不成功,再采用动态域名解析的方法。可以将一些常用的域名放入静态域名解析表中,这样可以大大提高域名解析效率。3、DNS查询
若想跟踪一个FQDN名的解析过程,在LinuxShell下输入dig www +trace,返回的结果包括从根域开始的递归或迭代过程,一直到权威域名服务器。
GeniePro DNS 应对DNS劫持和DNS缓存中毒攻击的关键性机制:一致性检查
每个Geniepro节点将自身的DNS记录发送给工作组内其他节点请求一致性检查;
每个Geniepro节点将自身的记录与收到的记录进行比较;
每个Geniepro工作组的通信协调节点将获得的DNS记录更新发送给其他组的通信协调节点请求一致性检查;
每个Genipro工作组的通信协调节点向上一级DNS服务器请求更新记录并与收到的其他通信协调节点的记录进行比较。4、DNS安全
(1) 针对域名系统的恶意攻击:DDOS攻击造成域名解析瘫痪。
(2) 域名劫持:修改注册信息、劫持解析结果。
(3) 国家性质的域名系统安全事件:“.ly”域名瘫痪、“.af”域名的域名管理权变更。
(4) 系统上运行的DNS服务存在漏洞,导致被黑客获取权限,从而篡改DNS信息。
(5) DNS设置不当,导致泄漏一些敏感信息。提供给黑客进一步攻击提供有力信息。5、DNS配置
先配置/etc/named.conf
//
// named.conf
//
// Provided by Red Hat bind package to configure the ISC BIND named(8) DNS
// server as a caching only nameserver (as a localhost DNS resolver only).
//
// See /usr/share/doc/bind*/sample/ for example named configuration files.
//
options {
listen-on port 53 { 172.16.100.6; };
// 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 { any; };
recursion yes;
forwarders { 10.0.0.1; };
dnssec-enable no;
dnssec-validation no;
/* 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";
};
zone "bilibili.com" IN {
type master;
file "bi.com.ndb";
};
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
在配置/var/named下的文件,名为:www.bilibili.com
$TTL 60
@ IN SOA @ rname.invalid. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
IN NS @
@ IN A 127.0.0.1
www IN A 172.16.100.8
七、编写shell脚本完成远程主机的一键配置
其实这一块能内容很简单,编辑一个简单的shell脚本,分别完成,web创建前和创建后的所有步骤
第一个脚本为:
#!/bin/bash
ansible-playbook playbooks/1-deploy-web.yml
ansible-playbook playbooks/2-install-discuz.yml
ansible-playbook playbooks/3-deploy-mysql.yml
在第一个脚本执行完毕后,打开浏览器,输入http://172.16.100.2/bbs,完成安装,其中数据库主机为:172.16.100.7,数据库名为:yzybbs,用户为:yzy,密码为12345,管理员密码随机设取
如图:
第二个脚本为:
#!/bin/bash
ansible-playbook playbooks/4-deploy-otherweb.yml
ansible-playbook playbooks/5-index-jump.yml
ansible-playbook playbooks/6-deploy-lvs.yml
ansible-playbook playbooks/7-deploy-webvip.yml
最后作品:
(域名是随机选取的,如有侵权请联系作者)