六、自动化部署工具fabric

  1. 之前的paramiko库可以帮我们在python程序中连接远程服务器,但步骤较为繁琐,使用paramiko时需要花费比较多的时间在python编程上,fabric也是一个python编写的基于ssh的库,提供简洁的api,可以让运维人员专注于linux服务器的管理,而不是python程序设计的细节
  2. 从简单应用中看fabric
    pip install fabric --user
    使用fabric时,需要编写一个python文件,文件中包含一些函数,在fabric中称为task
    fab命令执行时,默认从当前文件夹下的fabfile.py文件中读取内容,也可以在运行时使用-f选项指定fabfile文件,编写fabfile文件如下
    from fabric.api import run, sudo
    from fabric.api import env
    
    env.hosts=['192.168.56.101', '192.168.56.104']
    env.port = 22
    env.user = 'root'
    env.password = 'wodemima'
    def hostname():
        run('hostname')
    def ls(path='.'):
        run('ls {}'.format(path))
    
    def tail(path='/etc/passwd', line=10):
        sudo('tail -n {} {}'.format(line, path))
    

    其中run是远程命令的封装,sudo是以sudo权限执行,env是全局的配置字典,使用--list查看当前的task



    执行任务hostname



    像函数一样执行task
  3. fabric的执行模型
    创建任务列表,即fabric中的task列表,fabfile中的系列python函数,对每个任务构建其目标主机,可以通过role装饰器指定(下面会讲),通过env.hosts指定,通过-H参数指定,之后遍历任务列表,对每个任务列表在相应的目标主机上执行,可以理解为两层for循环,外层是task,内层是host。默认的fabric会串行执行该过程。
  4. fabric的命令行参数



    在命令行执行fab命令


  5. fabric的env字典
    fabric的配置信息除了可以在命令行指定以外,还可以使用env字典来配置,就像一开始给出的例子一样,在env中配置ssh信息。常用的配置有

    可以使用下面的方式查看env配置信息
    fab show_env
    import json
    from fabric.api import env
    def show_env():
        print(json.dumps(env, indent=4)
    
  6. fabric提供的命令
    • run远程执行命令
    • sudo以sudo权限执行命令
    • local在本地执行命令,如果要执行复杂的命令可以使用subprocess
    • get获取远程文件,指明remote_path与local_path即可
    • put上传文件,知名remote_path,local_path,与远程文件权限mode
  7. fabric上下文管理器
    有时候我们只想在执行某些命令时改变系统设置,而不是全局修改,当命令执行完毕后返回至之前的环境中,上下文管理器可以帮我们完成类似请求
    • cd切换远程目录
      with cd('/etc/'):
          run('ls')
      
    • lcd切换本地目录
    • path用于设置远程服务器的环境变量,三种行为可选


    • prefix命令前缀,即对之后的操作的每一条命令,都加上该前缀
    • shell_env用于设置shell环境变量
    • settings用于临时覆盖env
    • hide隐藏输出,可供隐藏的信息类型如下



    • quiet隐藏全部输出
    • warn_only settings(warn_only=True)当命令出错时仅给出警告,继续执行
  8. fabric装饰器
    装饰器的使用与原生python装饰器的使用相同
    • task装饰器
      task是fabric的执行单元,默认情况下,fabfile中的每一个函数都是task,当我们指定了一个某一个函数为task(使用装饰器@task修饰该函数)时,其他函数将不会被认为是task
    • hosts装饰器
      fabric指定目标主机的方式有三种,可以在命令行中使用-H选项指定主机,可以在env设置hosts中指定主机,可以使用hosts装饰器指定task主机
      通过hosts指定该task的目标主机
      类似于
      fab task:hosts='host1;host2'
    • role装饰器
      介绍装饰器之前先理解role的概念,role即角色,在一个web集群中,可能有数据库服务、缓存服务、dns服务、web页面服务,每个服务又可能包含有多台主机,将相同功能的主机组定义为一个角色,分配一个角色名称,在task前使用role装饰器选定该role,可以让task在该role指定的主机上运行,归根结底还是为了方便主机的选取。定义role时,使用env.roledefs这个字典来定义,将内容赋值给该字典,即可用@role装饰器使用其中的role,看下面的例子
      from fabric.api import run, sudo,env
      env.hosts=['192.168.56.101', '192.168.56.102']
      env.port=22
      env.user='root'
      env.password='wodemima'
      env.roledefs={
              'test1':['192.168.56.101'],
              'test2':['192.168.56.102']
              }
      @roles('test1')
      @task
      def ls(path='./'):
          run('ls {}'.format(path))
      
    • parallel
      在目标服务器列表上并行执行task,可以理解为同时在多台服务器上执行task,fabric中的执行模型在之前提到,串行执行的方式对一些执行时间较长的任务会花费我们许多时间,这些进程间本来没有任何的联系,并行执行更符合需求。要并行执行task,只需要使用parallel装饰器即可。另外可以使用fab命令的-P参数(--parallel)通知程序并行执行程序,另外还可以使用env.parallel变量来指定是否并行执行
    • run_once
      这个装饰器可以让被修饰的task仅运行一次,比如打包本地文件上传至服务器,打包本地文件的行为应该仅需运行一次,而不管其他task多次调用该task
    • serial
      和parallel相反,serial强制fabric串行执行task
  9. 其他有用函数
    • execute
      execute可以让我们在一个task中执行其他task
    • utils函数 fabric.utils
      abort终止程序执行,打印错误信息
      warn输出警告信息
      puts打印输出
    • color函数 fabric.colors
      包含如下函数


  10. 最后看一个综合性的例子,在服务器组部署redis服务
    编辑fabfile文件
    from fabric.api import *
    from fabric.contrib.console import confirm
    from fabric.colors import green
    from fabric.utils import abort
    
    env.hosts = ['192.168.56.101', '192.168.56.102']
    env.user = 'root'
    env.password = 'wodemima'
    env.port = 22
    
    
    @task
    @runs_once
    def local_test():
        local("tar -xf redis-4.0.9.tar.gz")
        with lcd('redis-4.0.9'), settings(warn_only=True):
            result = local("make && make test", capture=True)
            if result.failed and not confirm("Tests failed, continue anyway?"):
                abort("Aborting at user request!")
            else:
                print green("all tests passed without error")
    
    
    @task
    def put_file():
        put('redis-4.0.9.tar.gz', '/tmp/redis-4.0.9.tar.gz')
    
    
    @task
    def install():
        with cd('/tmp'):
            run('tar -xf redis-4.0.9.tar.gz')
            with cd('/tmp/redis-4.0.9'):
                run('make && make install')
    
    
    @task
    def clean_local():
        local("rm -rf redis-4.0.9")
    
    
    @task
    def install_process():
        execute(local_test)
        execute(put_file)
        execute(install)
        execute(clean_local)
    
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,658评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,482评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,213评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,395评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,487评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,523评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,525评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,300评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,753评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,048评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,223评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,905评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,541评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,168评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,417评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,094评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,088评论 2 352

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,646评论 18 139
  • 最近公司给了台web测试服务器,最近正好学习python语言的flask框架,琢磨着搭个小博客玩玩,但是每次修改代...
    haort阅读 6,533评论 3 22
  • Python 面向对象Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对...
    顺毛阅读 4,212评论 4 16
  • 不会。实际上,隔离见证的设计目标中有一条就是,要避免由于用户费率估计以及矿工最优费率区块建构,而迫使用户进行多维度...
    SegWit阅读 198评论 0 0
  • 1 离家出走 今天阳光明媚,琳琳家却发生了一家大事,琳琳的妈妈病了,(琳琳身为一只西施犬)琳琳到...
    雷恒阳阅读 527评论 0 3