上篇笔记介绍了Fabric的概念、支持的元操作及task的定义方法,本篇笔记旨在说明如何在多台目标机器上正确地执行tasks以实现远程自动部署或运维。特别地,文中会说明如何配置fabric task以便远程执行命令时不会弹出密码输入提示。
1. Fabric的任务运行规则
根据Fabric Execution model的说明,fabric默认以串行方式运行tasks,具体而言:
1)在fabfile及其import文件中定义的task对象依次被创建(只是创建对象,并未真正执行),任务之间保持其定义的先后顺序。
2)对于每个task,生成将要运行该task的目标机器列表。
3)fab执行tasks时,按任务被指定的顺序依次执行这些任务;针对每个任务,依次在其指定的目标机器运行且只运行一次。
4)未指定目标机器的task被当作本地任务运行,且只会被运行一次。
假设在fabfile.py中定义了如下tasks:
from fabric.api import run, env
env.hosts = ['host1', 'host2']
def taskA():
run('ls')
def taskB():
run('whoami')
在终端运行fab –list时,我们会看到taskA和taskB两个任务,运行之:
$ fab taskA taskB
结果示例如下:
taskA executed on host1
taskA executed on host2
taskB executed on host1
taskB executed on host2
通过上面的实例,大家应该可以明白fabric默认的串行执行策略是怎么回事。
Fabric还允许我们指定以并行方式(借助multiprocessing模块实现多个进程并行执行)在多台机器上并行地运行任务,甚至还可在同一个fabfile文件中指定某些task以并行方式运行,而某些task以默认的串行方式运行。具体地,可以借助@parallel或@serial指定任务的运行模式,还可以在命令行中通过-P参数指定任务是否要并性执行。示例如下: