fabric在执行一些命令或者脚本的时候,会执行了操作,但是,进程启动失败,google,发现fabric在执行脚本或者进程的时候,加入set -m参数,就可以正常运行了,解释是:"set -m" turns on job control, you can run processes in a separate process group,理解为:新开一个作业控制,让这个进程运行在独立的进程组。
比如: run('/scripts/tomcat.sh start') 这个步骤修改为 run('set -m;/scripts/tomcat.sh start')
同时,对于fabric处理进程脚本之类的,不建议采用restart操作,而是reload,因为nginx之类的退出机制关系,restart的话,会处理剩下的业务数据,而fabric的session可能在执行完restart命令之后就关闭了,导致restart失败,此处,新增等待时间都不一定能够restart成功,因为不清楚nginx最后释放资源所需的时间。
即: run('/etc/init.d/nginx restart') 或者run('/etc/init.d/nginx stop && sleep 5 && /etc/init.d/nginx start')这个步骤修改为 run('/etc/init.d/nginx reload')
fabric定义主机的优先级为:
1.每个任务中,命令行主机装饰覆盖一切 Per-task, command-line host lists (fab mytask:host=host1) override absolutely everything else.
2.每个任务中,fabfile中定义的装饰器主机列表覆盖env变量 Per-task, decorator-specified host lists (@hosts('host1')) override the env variables.
3.在fabfile中定义的env.hosts Globally specified host lists set in the fabfile (env.hosts = ['host1']) can override such lists set on the command-line, but only if you’re not careful (or want them to.)
4.Globally specified host lists set on the command-line (--hosts=host1) will initialize the envvariables, but that’s it.
实例:
当你想在 APP 组里面排除host1这台服务器的时候,你可以使用 env.exclude_hosts或者是 -x这个命令行参数来排除
env.exclude_hosts=['host1']
或
fab -R APP -x host1 common
这样执行的时候就会把 host1 这台服务器给排除在外了。
使用-x的方法排除的话,不能在任务上面使用装饰器声明。
@roles('APP')
def nginxrd():
run('/etc/init.d/nginx reload')
就不能用-x 排除指定服务器