项目背景:
公司的日常运维任务需要以一种批量、快速、规范的方式去解决。我们需要自己编写一些实现可以减轻我们工作量的脚本文件去解决我们特定的需求,要明白,不同的公司需要解决的问题不尽相同。所以我们要用一种可以定制的方法,这个时候,我引入了Fabric:系统批量运维管理器!!!
实验环境:
vmware workstation 11
centos6.5的系统下
fabric服务器主机:ip:192.168.0.14
堡垒机:ip:192.168.0.44
目标服务器:ip:192.168.0.26
SecureCRT (ssh远程连接软件)
软件介绍:
Fabric官网对于它的说明:
Fabric is a Python (2.5-2.7) library and command-line tool for streamlining the use of SSH for application deployment or systems administration tasks.
It provides a basic suite of operations for executing local or remote shell commands (normally or via sudo
) and uploading/downloading files, as well as auxiliary functionality such as prompting the running user for input, or aborting execution.
译文:
Fabric是基于python(2.5到2.7)实现ssh命令行工具,简化了ssh的应用程序部署及系统管理任务,它提供了系统基础的操作组件,可以实现本地或远程shell命令,包括命令执行、文件上传、下载及完整执行日志输出。
fab常用参数:
fab作为Fabric程序的命令行入口,提供了丰富的参数调用。
Fab使用格式如下:
fab [options] <command> [:arg1,arg2=val2,host=,hosts='h1,h2,.....:] .....
-l:显示定义好的任务函数名称
-f:指定fab入口文件,缺少文件名为fabfile.py
-g:指定网关
-H:指定主机名,多主机使用逗号隔开
-P:以异步并行方式运行多主机任务,缺省情况下同步运行;
-R:指定role以角色区分不同业务组设备;
-t:设置主机连接TimeOut时间(Second);
-T:设置远程主机命令执行Timeout时间
-w:当命令执行失败,发出街区,而非默认中止命令。
-p:连接主机的密码
全局属性设定:
全局属性:
env.host:定义目标主机,以Python列表的形式定义,如env.host=['node01', 'node02']
env.exclude_hosts:排队指定主机
env.user:定义远程用户名
env.port:定义远程端口
env.password:定义远程密码
env.passwords:与上功能一致,区别在于不同主机不同密码的应用场景,需要注意的是,配置passwords时需要配置用户、主机、端口等信息。如:
env.passwords = { '[email protected]:22' : '123456' '[email protected]:22' : '234567' '[email protected]:22' : '345678' }
env.gateway:定义网关(中转、堡垒机)IP,如env.gateway='192.168.198.1'
env.deploy_release_dir:自定义全局变量,格式:env.+variable_name,如:env.deploy_release_dir、env.age、env.sex等
env.roledefs:定义角色分组,如web组与DB组区别出来:
env.roledefs = { 'webservers' : ['192.168.0.14', '192.168.0.15'] 'dbservers' : ['192.168.0.16', '192.168.0.17'] }
常用API
local:执行本地命令,例子:local('ifconfig')
lcd: 切换本地目录,例子:lcd('/root')
cd: 切换远程目录,例子:cd('/home')
run: 执行远程命令,例子:run('ifconfig')
sudo:sudo方式执行远程命令,例子:sudo('service httpd restart')
put: 上传本地文件到远程主机,例子:put('/home/local.txt','/home/away.txt')
get: 从远程主机下载文件到本地,例子:get('/home/away.txt','/home/local.txt)
prompt: 获取提示信息确认,例子:prompt("please input you want input:")
confirm: 获得提示信息确认,例子:confirm("Tests failed.Continue[Y/N]")
reboot: 重启远程主机,例子:reboot()
实验流程:
一、软件下载
[root@Master ~]# easy_install fabric #首先你得确保你安装了python-setuptools
二、查看是否安装成功
可以看到没有报错,说明模块成功导入。
三、官网入门测试示例
1、fabric官网示例图
2、在自己主机上测试
因为我已经添加了ssh信任,所以没有提示输入远程主机的密码。
如果你不清楚如何设置,可以看我的下面的这篇文章。
http://9399369.blog.51cto.com/9389369/1750915
四、远程执行命令,并且在本机上得到输出
1、创建一个脚本文件
[root@Master ~]# cat fuchao01.py #!/usr/bin/env python from fabric.api import * env.user="root" env.hosts=['192.168.0.44'] env.passwd="123456" @runs_once 查看本地系统信息,党有多台主机只运行一次 def local_task(): #本地的任务函数 local("uname -a") def remote_task(): with cd ("/home/"): #with的作用是让后面的表达式语句效果继承当前状态。 run("ls -l")
2、通过fab命令调用local_task任务函数
1、脚本文件编写
[root@Master ~]# vim fuchao02.py #!/usr/bin/env python from fabric.api import * env.user="root" env.hosts=['192.168.0.44'] env.passwd="123456" @runs_once def input_raw(): return prompt("please input directory name:",default="/root") def worktask(dirname): run("ls -l "+dirname) @task def go(): getdirname = input_raw() worktask(getdirname)
2、脚本执行
七、网关模式文件上传与执行
1、脚本文件的编写
[root@Master ~]# cat fuchao03.py #!/usr/bin/env python from fabric.api import * from fabric.context_managers import * from fabric.contrib.console import confirm env.user="root" env.gateway='192.168.0.44' #堡垒机ip env.hosts=['192.168.0.26'] #真正的服务器 env.password="123456" #服务器密码 lpackpath="/home/lnmp1.2.tar.gz" #本地的文件,你可以用其它的文件 rpackpath ="/home/install" #远程主机的目录 @task def put_task(): run("mkdir -p /home/install") with settings(warn_only=True): result = put(lpackpath,rpackpath) #上传本地文件到远端 if result.failed and not confirm("put file failed,Continue[Y/N]?"): abort("Aborting file put task!") @task def run_task(): with cd("/home/install"): run("tar -zxvf lnmp1.2.tar.gz") with cd("lnmp1.2/"): run("./install.sh ") @task def go(): put_task() run_task()
2、脚本执行
项目总结:
通过这次项目实战,让我对于fabric软件整体有了更清晰的认识,我想对于作为51博友的你来说,也是有一定收获的,不是吗?希望大家都能有得到进步!!!谢谢大家。
本文出自 “积少成多” 博客,谢绝转载!