Fabric管理多台Linux机器的command tool

本文发布时间: 2019-Mar-22
相信 Administrator 管理过两台以上的 Linux Server 都一定会找 tool 让多台机器同时执行指令,这也应用在 Deploy 任何 application 到多台机器或者是同时更新系统套件…等,网路上有蛮多套 command line tool 像是 capistrano、Fabric、pssh、dsh…等都,本篇会以 Python 所推的 Fabric 来做介绍。另外 Ruby 所写的 capistrano tool 也是不错的选择,这两套其实大同小异,可以将 Deploy 的逻辑写成单一 file 再透过 task 定义来决定执行的工作。当然你也可以透过此 tool 来管理 local 端动作,但是这有点多此一举,因为基本的 Shell 就可以完成了,如果熟悉 Python 则选 fabric,如果喜欢写 Ruby 则可以试试看 capistrano。安装方式(Installation)如果是 CentOS 系列可以透过 yum 套件管理,Ubuntu 或 Debian 则是透过 aptitude 方式安装。Yum# install python pip tool and fabric commandyum -y install python-pippip-python install fabricAPT# install python easy_installaptitude -y install python-pip# install fabric commandpip install fabric安装 capistrano 可以透过 Ruby gem。$ gem install capistrano基本介绍Fabric 可以透过 command line 或者是读取 fabfile.py 档案方式来执行,fabfile.py 务必放在执行 fab command 的目录底下,也就是的命令列所在位置 。假设目前在 /home/appleboy 目录下,就必须将 fabfile.py 存放在 /home/appleboy。简易设定 /home/appleboy/fabfile.py,内容def hello(): print("Hello world!")该目录底下执行$ fab helloHello world!Done.如果不透过 fabfile.py 档案的话,你直接打 fab 会得到 Couldn’t find any fabfiles!,看到这讯息没关系,一样可以用指令方式来达成上面的结果。学习 fabric 前,有一个很必要的条件,就是必需熟悉 Linux command 及 Shell script 用法,个人推荐鸟哥的网站,把基础文件都看过后,就没有任何 Linux 系统可以难倒你。如何用 fab command 直接得到上述的结果呢?$ fab -p xxxx -H localhost -- 'echo "Hello world!";'上述指令会产生下面结果[localhost] Executing task '<remainder>'[localhost] run: echo "Hello world!";[localhost] out: Hello world![localhost] out: Done.Disconnecting from localhost... done.执行 fab 就像是透过 ssh 登入机器,需要帐号及密码,执行当下就必须提供使用者帐号及密码,如果没给参数,预设就是执行该 command 的使用者,-p 则是给密码,这样就不会询问密码了,-H 是指定要对哪个 host 执行该命令,也许同时 3 台机器,-H 请改写成 -H web1,web2,web3。要换其他使用者直接加上 -u 参数$ fab -u deploy -p xxxx -H localhost -- 'echo "Hello world!";'接下来聊聊该如何写 fabfile.py,fab 有分 local 端或 Host 端执行,如果只用在 local 端就跟写 Shell script 没啥不同,fabric 提供了 local function 执行 local command。对于专案而言,你可以建立 fabfile.py 设定档,里面写入from fabric.api import localdef prepare_deploy(): local("git add -p && git commit") local("git push")执行 fab prepare_deploy 会将专案已修改的 commit 到 server,当然你也可以拆开来执行from fabric.api import localdef clone(): local("git clone [email protected]:appleboy/minify-tool.git")def commit(): local("git add -p && git commit")def push(): local("git push")def prepare_deploy(): commit() push()大家可以依照专案需求来定义工作项目,好让团队所有的成员都可以使用。错误处理看到上面例子,可以知道透过 fab clone 来初始化专案,执行后,发现多了 minify-tool 目录,但是再执行同样指令一次呢?会发现出现底下错误讯息[localhost] local: git clone [email protected]:appleboy/minify-tool.gitfatal: destination path 'minify-tool' already exists and is not an empty directory.Fatal error: local() encountered an error (return code 128) while executing 'git clone [email protected]:appleboy/minify-tool.git'Aborting.程式就停止了,但是如果底下有必须执行的工作,该怎么办,必须要 import with_statement 模组,将程式码改成底下 from __future__ import with_statementfrom fabric.api import local, settings, abortfrom fabric.contrib.console import confirmdef clone(): with settings(warn_only=True): result = local("git clone [email protected]:appleboy/minify-tool.git") if result.failed and not confirm("Tests failed. Continue anyway?"): abort("Aborting at user request.")会发现画面还是会出现错误讯息,最后跳出 confirm 视窗键入 Y,结果会得到 Done!,键入 N 则得到 Aborting 讯息。[localhost] local: git clone [email protected]:appleboy/minify-tool.gitfatal: destination path 'minify-tool' already exists and is not an empty directory.Warning: local() encountered an error (return code 128) while executing 'git clone [email protected]:appleboy/minify-tool.git'Tests failed. Continue anyway? [Y/n] yDone.接着来定义 deploy 工作内容def deploy(): code_dir = 'minify-tool' with cd(code_dir): run("git pull")上面多了二个函式,就是 cd 和 run,cd 很直觉,就跟 Linux command 一样,run 跟 local 不同的地方就是 run 是用来管理远端机器。定义 Host最前面有提到可以用 -H 方式定义,那也可以直些写在 fabfile.py 设定档env.hosts = ['127.0.0.1']env.hosts = ['localhost']env.hosts = ['web1']上面写法都正确,host name 可以直接在 /etc/hosts 档案内定义,将程式码改为底下env.hosts = ['my_server']def deploy(): code_dir = 'minify-tool' with settings(warn_only=True): if run("test -d %s" % code_dir).failed: run("git clone [email protected]:appleboy/minify-tool.git %s" % code_dir) with cd(code_dir): run("git pull")如果没有定义 env.hosts,你也可以执行$ fab -H web1 deploy这次先介绍到这里,或许之后有机会来介绍进阶用法


(以上内容不代表本站观点。)
---------------------------------
本网站以及域名有仲裁协议。
本網站以及域名有仲裁協議。

2024-Mar-04 02:10pm
栏目列表