Fabric入门:
   Fabric是一个Python的库,是一个提供给使用SSH相关的应用程序开发者和系统管理的命令行工具它提供了一个操作执行本地或者远程机器shell命令的套件,可以上传下载文件,提示用户输入和中止执行等通常通过创建一个python的module其中包含一个或者多个函数,然后通过fab命令来执行。

Fabric安装:

Ubuntu下:
sudo apt-get install fabric
或者 pip install fabric
或者 easy_install fabric
Centos下:
yum install python-setuptools
easy_install pip
pip install fabric


第一个Fabric程序:

vim fabfile.py
def hello():
    print("Hello world!")
执行:
fab hello
注意:hello函数必须要写在fabfile.py这个文件中,fab命令默认是去这个文件中
寻找指定的函数,如果不想使用fabfile.py也可以通过fab -f选项来指定自己定义的文件名



带参数的Fabric程序:

vim fabfile.py
def hello(name="default"):
    print("Hello %s!" % name)
执行(指定参数):
方式一:fab hello:name=zhang(有多个参数的时候一一指定)
方式二:fab hello:zhang (只有一个参数的时候)


Fabric执行本地shell:

vim fabfile.py
from fabric.api import local
def prepare_deploy():
    local("ls -al")


Fabric捕获错误:

当执行的shell没有成功的话程序就好直接退出发生occur,那有什么办法可以捕获到错误呢
vim fabfile.py
from fabric.api import local, settings, abort
from fabric.contrib.console import confirm
def test():
    with settings(warn_only=True):#setting设置变量,warn_only=True用于设置指定代码段如果出错的话就有abortd转为warnings状态(说白了就是在warn_only=True包含的代码快中 如果发生了错误原本是会直接终止的,现在变为不终止了变了警告)
        result = local('ls al', capture=True) #执行了一个错误的shell命令,通过capture=True设置为可捕捉,
                                              #通过failed属性或return_code来判断是否出错
    if result.failed and not confirm("Tests failed. Continue anyway?"):
    #confirm用来给用户一个提示的对话框,并给出yes/no让用户输入
        abort("Aborting at user request.")
    #abort是用于输出里面的信息并终止


Fabric在远程执行shell:

from fabric.api import run
def remoteshell():
#run用于在远程执行shell
    run("ls -al /")
使用方式(会提示你输入密码):
fab -H username@远程主机IP remoteshell


怎么切换到某个目录下执行某个命令呢?

方式一:
from fabric.api import run
def remoteshell():
#with声明的本质就是把在其block内的代码作为一个总体来执行,提高安全可靠性
    with cd("/tmp"):
        run("ls -al")
方式二:
from fabric.api import run
def remoteshell():
    run("cd /tmp;ls -al")
注意:千万不要写成下面这种形式
def remoteshell():
    run("cd /tmp")
    run("ls -al")
上面的结果是不正确的,因为两次run的运行时没有关联的,两个run不是一个运行整体,结果不会相互影响。只有通过方式一的with声明将两条run命令作为一个整体来运行。


Fabric怎么不需要输入密码在远程执行shell命令:
不输入密码来执行远程shell命令就要依靠Fabric强大的变量
env.hosts 用于定义远程机器的地址和连接用户
env.password 用户定义远程机器的密码,有多种定义方式

我工作中的一个列子部署六台服务器(安装一些测试软件):
果断装上了Fabric:
代码如下:

from fabric.api import run
env.hosts=["[email protected]","[email protected]","[email protected]","[email protected]","[email protected]","[email protected]"]
env.password="123456"
def installmem():
        run("wget http://pyropus.ca/software/memtester/old-versions/memtester-4.2.2.tar.gz")
        run("tar zxvf memtester-4.2.2.tar.gz")
        run("cd memtester-4.2.2;make;make install")
 env.hosts定义方式:
按照 username@ip:端口  端口默认是22  username也可以省去,默认是执行fab命令的用户
上面的这种密码方式需要密码都是相同的,这或许很多情况下是无法满足要求的。那该怎么办呢:
使用以下方式来定义:一个host对应一个密码
env.password[
hosts1:passwowd1
hosts2:password2
]


Fabric怎么不使用fab命令来执行呢?

答案肯定是OK的了,可以使用execute来模拟fab命令直接在使用python代码执行任务,不需要在shell命令行下调用fab命令来执行任务代码如下:

from fabric.api import run,env,execute
env.hosts=["[email protected]"]
env.password="server"
def test():
    run("ls -al")
if __name__=="__main__":
    execute(test)