Python的自动化部署模块Fabric的安装及使用指南
fabric是python2.5或者更高的库,可以通过ssh在多个host上批量执行任务.完成系统管理任务.它提供一套基本操作在本地和远程执行shell命令,或者上传下载文件,辅助提供用户输入或终止执行.
下面安装fabric模块有2种方法:
1.使用easy_install(下面是debain5环境)
root@10.1.6.200:pshell#apt-getinstallpython-dev(安装Python头文件) root@10.1.6.200:pshell#apt-getinstallpython-setuptools(安装easy_install) root@10.1.6.200:pshell#wgethttp://peak.telecommunity.com/dist/ez_setup.py root@10.1.6.200:pshell#pythonez_setup.py root@10.1.6.200:pshell#easy_installfabric
Searchingforfabric Readinghttp://pypi.python.org/simple/fabric/ Bestmatch:Fabric1.6.1 Downloadinghttp://pypi.python.org/packages/source/F/Fabric/Fabric-1.6.1.tar.gz#md5=c318ac3f7011ede0be1ca9a20f435735 ProcessingFabric-1.6.1.tar.gz RunningFabric-1.6.1/setup.py-qbdist_egg--dist-dir/tmp/easy_install-CVuLrs/Fabric-1.6.1/egg-dist-tmp-ZFNoWY warning:nopreviously-includedfilesmatching'*'foundunderdirectory'docs/_build' warning:nopreviously-includedfilesmatching'*.pyc'foundunderdirectory'tests' warning:nopreviously-includedfilesmatching'*.pyo'foundunderdirectory'tests' zip_safeflagnotset;analyzingarchivecontents... fabric.version:modulereferences__file__ AddingFabric1.6.1toeasy-install.pthfile Installingfabscriptto/usr/bin .... Installed/usr/lib/python2.5/site-packages/pycrypto-2.6-py2.5-linux-x86_64.egg Finishedprocessingdependenciesforfabric
2.使用pip(下面使用的是debian7环境)
apt-getinstallpython-pip pipinstallfabric apt-getinstallpython-paramiko
导入模块未报错说明安装成功.
实例:
1.在调用fabric的时候使用命令行参数,-H指定哪台主机
root@10.1.6.201:python#catfabfile4.py
#!/usr/bin/envpython #coding=utf-8 fromfabric.apiimport* defprintMem(): cmd_output=run('free-m') printcmd_output
root@10.1.6.201:python#fab-Hroot@10.1.1.45printMem-ffabfile4.py [root@10.1.1.45]Executingtask'printMem' [root@10.1.1.45]run:free-m [root@10.1.1.45]Loginpasswordfor'root':#提示输入密码 [root@10.1.1.45]out:totalusedfreesharedbufferscached [root@10.1.1.45]out:Mem:100596837036831 [root@10.1.1.45]out:-/+buffers/cache:100904 [root@10.1.1.45]out:Swap:191301913 [root@10.1.1.45]out:
totalusedfreesharedbufferscached Mem:100596837036831 -/+buffers/cache:100904 Swap:191301913 Done. Disconnectingfrom10.1.1.45:22000...done.
2.以上我们需要输入密码才能完成操作,怎样自动执行呢?可以在fabfile4文件中配置HOST.也就是环境变量.
root@10.1.6.201:python#vimfabfile.py
#!/usr/bin/envpython #coding=utf-8 fromfabric.apiimport* fromfabric.context_managersimport* env.host_string='10.1.1.45' env.port='22000'#默认端口22,默认登录用户root env.password='passwd' deftest1(): withcd('/home'): run('ls-l') test1()
root@10.1.6.201:python#pythonfabfile.py#脚本执行
[10.1.1.45]run:ls-l [10.1.1.45]out:total8 [10.1.1.45]out:drwxr-xr-x2debiandebian40962012-08-2711:54debian [10.1.1.45]out:drwxr-xr-x2rootnogroup40962013-05-2218:07ftp [10.1.1.45]out:
root@10.1.6.201:python#vimfabfile1.py
#!/usr/bin/envpython #coding=utf-8 fromfabric.apiimport* fromfabric.context_managersimport* env.hosts=['10.1.6.200','10.1.1.45'] env.port='22000' env.password='passwd' deftest1(): withcd('/home'):#更改目录 run('ls-l')
root@10.1.6.201:python#fabtest1-ffabfile.py#使用fab指定任务执行,注意文件后默认跟fabfile.py
[10.1.6.200]Executingtask'test1' [10.1.6.200]run:ls-l [10.1.6.200]out:total24 [10.1.6.200]out:drwxr-xr-x2davehedavehe40962013-02-2710:00davehe [10.1.6.200]out:-rw-r--r--1rootroot19902013-02-2709:55davehe.tar.gz [10.1.6.200]out:-rw-r--r--1rootroot3962013-05-1718:27rsync_log_130517 [10.1.6.200]out:-rw-r--r--1rootroot79162013-05-2021:04rsync_log_130520 [10.1.6.200]out:drwxr-xr-x2taomeetaomee40962013-01-2904:27taomee [10.1.6.200]out: [10.1.1.45]Executingtask'test1' [10.1.1.45]run:ls-l [10.1.1.45]out:total8 [10.1.1.45]out:drwxr-xr-x2debiandebian40962012-08-2711:54debian [10.1.1.45]out:drwxr-xr-x2rootnogroup40962013-05-2218:07ftp [10.1.1.45]out: Done. Disconnectingfrom10.1.1.45:22000...done. Disconnectingfrom10.1.6.200:22000...done.
3.使用get/put.利用sftp协议上传下载文件
root@10.1.6.201:python#catfabfile1.py
#!/usr/bin/envpython #coding=utf-8 fromfabric.apiimport* fromfabric.colorsimport* fromfabric.context_managersimport* env.hosts=['10.1.1.45'] env.port='22000' env.password='passwd' deftest1(): print(red("i'm201")) local('ls-l/tmp') deftest2(): print(green("i'mgetfile45to186")) get('/home/ftp/a.txt','/tmp/')#下载 #put('/tmp/','/home/ftp/')#上传 local('ls-l/tmp')#local运行本地命令 deffinal(): execute(test1) execute(test2)
root@10.1.6.201:python#fabfinal-ffabfile1.py
[10.1.1.45]Executingtask'final' [10.1.1.45]Executingtask'test1' i'm201 [localhost]local:ls-l/tmp total31684 drwxr-xr-x2rootroot4096May1322:08bin drwxr-xr-x3rootroot4096May1322:08conf drwxr-xr-x6rootroot4096May1322:08etc -rwxr-xr-x1rootroot6797May1322:08init -rw-r--r--1rootroot32400896May1322:07initrd.img-3.2.0-4-amd64 drwxr-xr-x6rootroot4096May1322:08lib drwxr-xr-x2rootroot4096May1322:08lib64 drwxr-xr-x2rootroot4096May1322:08run drwxr-xr-x2rootroot4096May1322:08sbin drwxr-xr-x6rootroot4096May1322:08scripts [10.1.1.45]Executingtask'test2' i'mgetfile45to186 [10.1.1.45]download:/tmp/a.txt<-/home/ftp/a.txt [localhost]local:ls-l/tmp total31688 -rw-r--r--1rootroot6May2922:29a.txt drwxr-xr-x2rootroot4096May1322:08bin drwxr-xr-x3rootroot4096May1322:08conf drwxr-xr-x6rootroot4096May1322:08etc -rwxr-xr-x1rootroot6797May1322:08init -rw-r--r--1rootroot32400896May1322:07initrd.img-3.2.0-4-amd64 drwxr-xr-x6rootroot4096May1322:08lib drwxr-xr-x2rootroot4096May1322:08lib64 drwxr-xr-x2rootroot4096May1322:08run drwxr-xr-x2rootroot4096May1322:08sbin drwxr-xr-x6rootroot4096May1322:08scripts Done. Disconnectingfrom10.1.1.45:22000...done.
上面实例中只列举了几个常用的farbic环境变量.如env.hosts,env.password等,可以不需要交互输入密码.
以下还有常用环境变量以供参考:
- exclude_hosts:指定一个主机列表,在fab执行时,忽略列表中的机器
- user:ssh使用哪个用户登录远程主机
- hosts:全局的host列表
- host_string:当fabric连接远程机器执行run、put时,设置的user/host/port等
- password:默认ssh连接远程主机密码,也可以是sudo提示输入密码
- password:一个字典供内部使用,为每台主机host设置密码,key是主机,value值存放密码
- port:设置默认端口
- roledefs:使用字典定义角色名字对应的主机ip
- roles:一个全局的role列表
fromfabric.apiimportrun,roles env.roledefs={ 'db':['db1','db2'], 'web':['web1','web2','web3'], } @roles('db') defmigrate(): #Databasestuffhere. pass @roles('web') defupdate(): #Codeupdateshere. pass
fab也可以使用命令设置环境变量,常用命令
- -fFABFILE,--fabfile=FABFILE 默认fabfile.py
- -HHOSTS,--hosts=HOSTS env.hosts=hosts
- -pPASSWORD,--password=PASSWORD env.password
- -RROLES,--roles=ROLES env.roles