Python3中详解fabfile的编写
本文详解Python Fabric库中fabfile的编写方法。介绍如何通过env对象配置主机、密码及角色分组,利用@roles修饰符实现不同角色的差异化任务执行,并列举local、run、sudo等常用API,帮助开发者高效完成远程服务器管理与自动化部署。
fab命令通常与用户编写的fabfile.py文件配合使用(若文件名不同,需通过-f参数指定文件名)。为了提升灵活性,部分命令行参数可通过代码方式替代。例如,原本在命令行中通过"-H 192.168.56.133,192.168.56.134"指定主机,可以在fabfile中通过定义env.hosts来实现,即设置"env.hosts=['192.168.56.133', '192.168.56.134']"。fabfile的核心内容由多个自定义的任务函数构成,每个函数负责实现特定的操作逻辑。
全局属性设定
env对象用于定义fabfile的全局配置,支持多种属性,包括目标主机、用户名、密码及角色划分等。各属性的具体说明如下:
- env.host:用于定义目标主机,支持使用IP地址或主机名,需以Python列表形式定义,例如:env.hosts=['192.168.56.133', '192.168.56.134']。
- env.exclude_hosts:用于排除指定的主机,例如:env.exclude_hosts=['192.168.56.133']。
- env.user:用于定义登录用户名,例如:env.user="root"。
- env.port:用于定义目标主机的SSH端口,默认值为22,例如:env.port="22"。
- env.password:用于定义统一密码,例如:env.password='1234567'。
- env.passwords:功能与password类似,但适用于不同主机需要不同密码的场景。需要注意的是,配置passwords时需同时指定用户、主机及端口信息,例如:
env.passwords = {
'root@192.168.56.131:22':'1234567',
'root@192.168.56.132:22':'1234567',
'root@192.168.56.133:22':'1234567',
'root@192.168.56.134:22':'1234567'
}
- env.gateway:用于定义网关(如中转服务器或堡垒机)的IP地址,例如:env.gateway = '192.168.56.1'。
- env.deploy_release_dir:用于自定义全局变量,格式为env.+"变量名称",例如env.deploy_release_dir、env.age、env.sex等。
- env.roledefs:用于定义角色分组,例如将主机划分为web组和db组,定义方式如下:
env.roledefs = {
'webservers':['192.168.56.131','192.168.56.132','192.168.56.133'],
'dbserver':['192.168.56.134','192.168.56.135']
}
在引用角色时,使用Python修饰符的形式。角色修饰符下方的任务函数即为其作用域。以下是一个示例:
@roles('webservers')
def webtask():
run('/etc/init.d/nginx start')
@roles('dbservers')
def dbtask():
run('/etc/init.d/mysql start')
@roles('webservers','dbservers')
def pubclitasj():
run('uptime')
def deploy():
execute(webtask)
execute(dbtask)
execute(pubclitask)
执行命令fab deploy即可实现不同角色执行对应的任务函数。
常用API
Fabric提供了一组简单但功能强大的fabric.api命令集,通过简单调用这些API即可满足大部分应用场景的需求。Fabric常用方法及说明如下:
- local:执行本地命令,例如:local('uname -s');
- lcd:切换本地目录,例如:lcd('/home');
- cd:切换远程目录,例如:cd('/data/logs');
- run:执行远程命令,例如:run('free -m');
- sudo:以sudo权限执行远程命令,例如:sudo('/etc/init.d/httpd start');
- put:上传本地文件到远程主机,例如:put('/home/user.info','/data/user.info');
- prompt:获取用户输入信息,例如:prompt('please input user password:');
- confirm:获取提示信息确认,例如:confirm("Tests failed. Continue[Y/N]?");
- reboot:重启远程主机,例如:reboot();
- @task:函数修饰符,标识该函数为fab可调用的任务,未标记的函数对fab不可见,仅作为纯业务逻辑存在;
- runs_once:函数修饰符,标识该函数只会执行一次,不受多台主机并发执行的影响。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









