任务背景:
公司的服务器越来越多, 维护⼀些简单的事情都会变得很繁琐。⽤ shell脚本来管理少量服务器效率还⾏, 服务器多了之后, shell脚本⽆ 法实现⾼效率运维。这种情况下,我们需要引⼊⾃动化运维⼯具, 对 多台服务器实现⾼效运维。
任务要求:
通过管理服务器能够按照需求灵活⾼效地管理所有应⽤服务器的运维 操作
任务拆解:
1, 需要⼀台服务器做管理端, 来连接管理所有的应⽤服务器
2, 考虑如果只针对⼀部分应⽤服务器进⾏运维操作如何实现(服务器 分组)
3, 学会将平台烂熟于⼼的linux操作命令转化为⾃动化运维的⽅式(常 ⻅模块的学习)
4, 如果操作⾮常的冗⻓, 学会使⽤playbook和role的⽅式来管理
学习目标:
能够安装ansible服务器和客户端 能够定义ansible主机清单进⾏服务器分组
能够使⽤hostname模块修改主机名
能够使⽤file模块做基本的⽂件操作
能够使⽤copy模块把⽂件拷⻉到远程机器
能够使⽤fetch模块把⽂件从远程拷⻉到本地
能够使⽤user模块管理⽤户
能够使⽤group模块管理⽤户组
能够使⽤cron模块管理时间任务
能够使⽤yum_repository模块配置yum
能够使⽤yum模块安装软件包
能够使⽤service模块控制服务的启动,关闭,开机⾃启动
能够使⽤script模块在远程机器上执⾏本地脚本
能够使⽤command与shell模块远程执⾏命令
能够编写playbook实现httpd
能够使⽤roles实现lamp
一、认识自动化运维
问题: 假设我要去1000台服务上做⼀个操作(如nginx服务器修改配置⽂件 ⾥的某⼀个参数), 下⾯两种⽅法缺点明显:
1. 按传统的⽅法,
⼀台连着⼀台服务器的ssh上去⼿动操作。
缺点: 效率太低。
2. 写个shell脚本来做。
缺点: 管理的机器平台不⼀致,脚本可能不具备通⽤性。 传密码麻烦(在⾮免密登录的环境下, 需要expect来传密码) 效率较低,循环1000次也需要⼀个⼀个的完成,如果⽤&符 放到后台执⾏,则会产⽣1000个进程。
⾃动化运维: 将⽇常IT运维中⼤量的重复性⼯作,⼩到简单的⽇常检 查、配置变更和软件安装,⼤到整个变更流程的组织调度,由过去的 ⼿⼯执⾏转为⾃动化操作,从⽽减少乃⾄消除运维中的延迟,实现 “零延时”的IT运维。
⾃动化运维主要关注的⽅⾯
假如管理很多台服务器,主要关注以下⼏个⽅⾯:
1. 管理机与被管理机的连接(管理机如何将管理指令发送给被管理 机)
2. 服务器信息收集 (如果被管理的服务器有centos7.5外还有其它 linux发⾏版,如suse,ubuntu等。当你要做的事情在不同OS上有 所不同,你需要收集信息,并将其分开处理)
3. 服务器分组(因为有些时候我要做的事情不是针对所有服务器, 可能只针对某⼀个分组)
4. 管理内容的主要分类 ⽂件⽬录管理(包括⽂件的创建,删除,修改,查看状态,远程拷⻉等) ⽤户和组管理 cron时间任务管理 yum源配置与通过yum管理软件包 服务管理 远程执⾏脚本 远程执⾏命令 常⻅的开源⾃动化运维⼯具⽐较
1. puppet(拓展) 基于ruby语⾔,成熟稳定。适合于⼤型架构,相对于ansible和 saltstack会复杂些。
2. saltstack(拓展) 基于python语⾔。相对简单,⼤并发能⼒⽐ansible要好, 需要维 护被管理端的服务。如果服务断开,连接就会出问题。
3. ansible 基于python语⾔。简单快捷,被管理端不需要启服务。直接⾛ ssh协议,需要验证所以机器多的话速度会较慢。
⼆、ansible
ansible是⼀种由Python开发的⾃动化运维⼯具,集合了众多运维⼯ 具(puppet、cfengine、chef、func、fabric)的优点,实现了批量 系统配置、批量程序部署、批量运⾏命令等功能。
特点:
部署简单
默认使⽤ssh进⾏管理,基于python⾥的paramiko模块开发
管理端和被管理端不需要启动服务
配置简单,功能强⼤,扩展性强
能过playbook(剧本)进⾏多个任务的编排
ansible环境搭建 实验准备: 三台机器,⼀台管理,两台被管理
1. 静态ip
2. 主机名及主机名互相绑定
3. 关闭防⽕墙, selinux
4. 时间同步
5. 确认和配置yum源(需要epel源)
实验过程:
第1步: 管理机上安装ansible,被管理节点必须打开ssh服务.
# yum install epel-release
# yum install ansible
# ansible --version
第2步: 实现master对agent的免密登录,只在master上做。(如果这 ⼀步不做,则在后⾯操作agent时都要加-k参数传密码;或者在主机清 单⾥传密码)
第3步: 在master上定义主机组,并测试连接性
服务器分组
ansible通过⼀个主机清单功能来实现服务器分组。
Ansible的默认主机清单配置⽂件为/etc/ansible/hosts.
示例:
示例:
示例: 定义10.1.1.12:2222这台服务器的别名为nginx1
示例: 没有做免密登录的服务器可以指定⽤户名与密码
示例: 利⽤别名来分组
⼩结:
主机清单的作⽤: 服务器分组。
主机清单的常⻅功能:
1. 可以通过IP范围来分, 主机名名字的范围来分
2. 如果ssh端⼝不是22的,可以传⼊新的端⼝。
3. 没有做免密登录,可以传密码。
练习: 不论你⽤哪种环境(免密或不免密,端⼝是否22), 请最终将两 台被管理机器加⼊到group1组即可
ansible模块
ansible是基于模块⼯作的,本身没有批量部署的能⼒。真正具有批 量部署的是ansible所运⾏的模块,ansible只是提供⼀种框架。ansible⽀持的模块⾮常的多,我们并不需要把每个模块都记住,⽽ 只需要熟悉⼀些常⻅的模块,其它的模块在需要⽤到时再查询即可。 查看所有⽀持的模块
如果要查看ping模块的⽤法,使⽤下⾯命令(其它模块以此类推)
官⽹模块⽂档地址: https://docs.ansible.com/ansible/latest/modules /list_of_all_modules.html
hostname模块
hostname模块⽤于修改主机名(注意: 它不能修改/etc/hosts⽂件) https://docs.ansible.com/ansible/latest/modules/hostname_modul e.html#hostname-module
将其中⼀远程机器主机名修改为agent1.cluster.com
file模块(重点)
file模块⽤于对⽂件相关的操作(创建, 删除, 软硬链接等) https://docs.ansible.com/ansible/latest/modules/file_module.html#f ile-module
创建⼀个⽬录
创建⼀个⽂件
递归修改owner,group,mode
删除⽬录(连同⽬录⾥的所有⽂件)
创建⽂件并指定owner,group,mode等
删除⽂件
创建软链接⽂件
创建硬链接⽂件
stat模块(了解)
stat模块类似linux的stat命令,⽤于获取⽂件的状态信息。 https://docs.ansible.com/ansible/latest/modules/stat_module.html #stat-module
获取/etc/fstab⽂件的状态信息
copy模块(重点)
copy模块⽤于对⽂件的远程拷⻉操作(如把本地的⽂件拷⻉到远程 的机器上) https://docs.ansible.com/ansible/latest/modules/copy_module.htm l
#copy-module 在master上准备⼀个⽂件,拷⻉此⽂件到group1的所有机器上
使⽤content参数直接往远程⽂件⾥写内容(会覆盖原内容)
使⽤force参数控制是否强制覆盖
使⽤backup参数控制是否备份⽂件
copy模块拷⻉时要注意拷⻉⽬录后⾯是否带"/"符号
练习: 在master上配置好所有的yum源,然后拷⻉到group1的远程 机器上(要求⽬录内的内容完全⼀致)
练习: 使⽤hostname模块修改过主机名后.在master上修 改/etc/hosts⽂件,并拷⻉到group1的远程机器上