先上一段简单的fabric代码:
from __future__ import with_statement
from fabric.api import *
env.user = \'zhangsan\'
env.hosts = [\'192.168.1.1\']
env.password = \'123456\'
with settings(warn_only=True):
local(\'pwd\')
with cd(\'/home/jianping.fan\'):
run(\'ls\')
当执行代码后出现:No hosts found. Please specify (single) host string for connection:
出现该错误的原因是fabric的环境env有hosts和hosts_string俩种方法,前者是连接多台机器,而后者是单台链接,按官方文档的说法,使用hosts指定主机,会遍历该列表中主机ip,但实际执行中并没有这样做,猜测也许与fabric的版本有关系.我安装的版本号是:1.14.0
因此,将env.hosts = [\'192.168.1.1] 改成env.hosts_string = \'192.168.1.1\'即可解决单台机器的连接问题.
附Fabric env对象和常用API
env对象:
env.hosts #定义目标主机,可以用IP或主机名表示,以python的列表形式定义。如env.hosts=[\'192.168.1.21\',\'192.168.1.22\'] env.exclude_hosts #排除指定主机,如env.exclude_hosts=[\'192.168.1.21\'] env.user #定义用户名,如env.user=\'root\' env.port #定义端口,默认为22,如env.port=\'22\' env.password #定义密码,如env.password=\'123456\' env.passwords #定义多个密码,不同主机对应不同密码,如:env.passwords = {\'root@192.168.1.21:22\':\'123456\',\'root@192.168.1.22:22\':\'654321\'} env.gateway #定义网关(中转、堡垒机)IP,如env.gateway=\'192.168.1.23 env.roledefs #定义角色分组,比如web组合db组主机区分开来:env.roledefs = {\'webserver\':[\'192.168.1.21\',\'192.168.1.22\'],\'dbserver\':[\'192.168.1.25\',\'192.168.1.26\']} env.deploy_release_dir #自定义全局变量,格式:env. + \'变量名称\',如env.age,env.sex等
env.roledefs的使用方法实例:
env.roledefs = {\'webserver\':[\'192.168.1.21\',\'192.168.1.22\'],\'dbserver\':[\'192.168.1.25\',\'192.168.1.26\']}
#引用分组时使用python装饰器方式来进行,如:
@roles(\'webserver\')
def webtask():
run(\'/usr/local/nginx/sbin/nginx\')
@roles(\'webserver\',\'dbserver\')
def publictask():
run(\'uptime\')
-----------------------------------------华丽的分割线----------------------------------------------------------------------------------------
常用API:
local #执行本地命令,如local(\'uname -s\') lcd #切换本地目录,如lcd(\'/home\') cd #切换远程目录 run #执行远程命令 sudo #sudo方式执行远程命令,如sudo(\'/etc/init.d/httpd start\') put #上次本地文件导远程主机,如put(\'/home/user.info\',\'/data/user.info\') get #从远程主机下载文件到本地,如:get(\'/data/user.info\',\'/home/user.info\') prompt #获得用户输入信息,如:prompt(\'please input user password:\') confirm #获得提示信息确认,如:confirm(\'Test failed,Continue[Y/N]?\') reboot #重启远程主机,如:reboot() @task #函数修饰符,标识的函数为fab可调用的,非标记对fab不可见,纯业务逻辑 @runs_once #函数修饰符,标识的函数只会执行一次,不受多台主机影响
更多详细用法请移步官网: https://fabric-chs.readthedocs.io/zh_CN/chs/tutorial.html
git: https://github.com/fabric/fabric/