ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。主要包括:
(1)、连接插件connection plugins:负责和被监控端实现通信;
(2)、host inventory:指定操作的主机,是一个配置文件里面定义监控的主机;
(3)、各种模块核心模块、command模块、自定义模块;
(4)、借助于插件完成记录日志邮件等功能;
(5)、playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务。
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包了。
在需要的目录下创建目录ansible:
mkdir ansible
使用cd命令转到ansible目录下,vim配置文件ansible.cfg,内容如下:
[defaults]
inventory = hosts # 定义被管理主机的文件
remote_user = root # ssh到远程主机的用户
编写完成后,保存并退出。
vim主机清单文件hosts,即把被管理的服务器填入hosts文件中,并为其分组(一般写主机名不写ip地址),如:
[webservers] yzy.bilibili.com ljm.bilibili.com [dbservers] ccc.bilibili.com [lvs] twh.bilibili.com
执行临时命令ad-hoc,格式为:ansible主机 -m 模块 -a '选项',如:
ansible all -a 'id root'
该语句的意思为查看所有主机的root用户的id,如果没有指定模块则默认使用shell模块;
下面再来举个例子,如何分别列出hosts中webservers组的主机信息:
ansible all --list-hosts
如何列出所有组的主机信息:
ansible all --list-hosts三、部署数据库服务器
MySQL 是一个关系型数据库,由瑞典 MySQL AB 公司开发,目前属于 Oracle 旗下公司。MySQL 最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS (Relational Database ManagementSystem,关系数据库管理系统) 应用软件之一。MySQL 是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。MySQL 所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策(本词条"授权政策"),它分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库。由于其社区版的性能卓越,搭配 PHP ,Linux和 Apache 可组成良好的开发环境,经过多年的web技术发展,在业内被广泛使用的一种web服务器解决方案之一,称之为LAMP。
ansible配合使用mysql_db、mysql_user在客户端创建数据库、创建用户及配置主从。
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.支持多种存储引擎。
本地需要管理远程的一批服务器,主要执行以下任务:
(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模块由于没有加载,所以无法识别;如果需要使用自定义的环境变量,就需要在最开始,执行加载自定义脚本的语句;
如何通过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服务器
--- - 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表示“是”。
--- - 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。
--- - 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。
--- - 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这是跳转文件的文件内容:
hosts是webservice组中的主机,即web1和web2。任务是利用ansible中的copy专有模块将远程主机上的/root/B1_yzy/file/index.html文件拷贝到webservice组中的主机的/var/yzy_web/路径下,权限所属的用户和组都为root,权限是0644。 五、部署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负载均衡技术。
工作模式有四种:nat / tun / dr / fullna
客户端不再直接访问后台应用服务器(real server),而是访问lvs调度器,调度器再根据它的调度算法将用户请求转发到real server。DR模式real server回应客户端,不用将回应发送到调度器。
调度算法有10种,常用的是rr轮询/wrr加权轮询/lc最少连接/wlc加权最少连接,其他还有基于局部的最少连接lblc/带复制的基于局部的最少连接lblcr/源地址散列sh/目标地址散列dh/期望的最短延迟sed/最少队列调度nq
(1) 开源,免费;
(2)在网上能找到一些相关技术资源;
(3)具有软件负载均衡的一些优点。
(1)最核心的就是没有可靠的支持服务,没有人对其结果负责;
(2)功能比较简单,支持复杂应用的负载均衡能力较差,如算法较少等;
(3)开启隧道方式需重编译内核;
(4)配置复杂;
(5)主要应用于LINUX,目前没有专门用于WINDOWS的版本,不过可以通过配置,使windows成为LVS集群中的real server(win2003、win2008中)。(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;
每个IP地址都可以有一个主机名,主机名由一个或多个字符串组成,字符串之间用小数点隔开。有了主机名,就不要死记硬背每台IP设备的IP地址,只要记住相对直观有意义的主机名就行了。这就是DNS协议的功能。
主机名到IP地址的映射有两种方式:
1)静态映射,每台设备上都配置主机到IP地址的映射,各设备独立维护自己的映射表,而且只供本设备使用;
2)动态映射,建立一套域名解析系统(DNS),只在专门的DNS服务器上配置主机到IP地址的映射,网络上需要使用主机名通信的设备,首先需要到DNS服务器查询主机所对应的IP地址。
通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析)。在解析域名时,可以首先采用静态域名解析的方法,如果静态域名解析不成功,再采用动态域名解析的方法。可以将一些常用的域名放入静态域名解析表中,这样可以大大提高域名解析效率。若想跟踪一个FQDN名的解析过程,在LinuxShell下输入dig www +trace,返回的结果包括从根域开始的递归或迭代过程,一直到权威域名服务器。
GeniePro DNS 应对DNS劫持和DNS缓存中毒攻击的关键性机制:一致性检查
每个Geniepro节点将自身的DNS记录发送给工作组内其他节点请求一致性检查;
每个Geniepro节点将自身的记录与收到的记录进行比较;
每个Geniepro工作组的通信协调节点将获得的DNS记录更新发送给其他组的通信协调节点请求一致性检查;
每个Genipro工作组的通信协调节点向上一级DNS服务器请求更新记录并与收到的其他通信协调节点的记录进行比较。(1) 针对域名系统的恶意攻击:DDOS攻击造成域名解析瘫痪。
(2) 域名劫持:修改注册信息、劫持解析结果。
(3) 国家性质的域名系统安全事件:“.ly”域名瘫痪、“.af”域名的域名管理权变更。
(4) 系统上运行的DNS服务存在漏洞,导致被黑客获取权限,从而篡改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脚本,分别完成,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
(域名是随机选取的,如有侵权请联系作者)