我想在本地运行我的结构脚本,然后登录到我的服务器,切换用户进行部署,激活项目.virtualenv,这会将dir更改为项目并发出git pull.
def git_pull():
sudo('su deploy')
# here i need to switch to the virtualenv
run('git pull')
Run Code Online (Sandbox Code Playgroud)
我通常使用virtualenvwrapper中的workon命令来源激活文件,postactivate文件将把我放在项目文件夹中.在这种情况下,似乎因为结构从shell内部运行,控制权交给了结构,所以我不能使用bash的源内置'$ source~/.virtualenv/myvenv/bin/activate'
任何人都有他们如何做到这一点的例子和解释?
从命令行调用"fab"时,如何将参数传递给结构任务?例如:
def task(something=''):
print "You said %s" % something
Run Code Online (Sandbox Code Playgroud)
$ fab task "hello"
You said hello
Done.
Run Code Online (Sandbox Code Playgroud)
是否可以在没有提示的情况下执行此操作fabric.operations.prompt
?
我想使用Fabric将我的Web应用程序代码部署到开发,登台和生产服务器.我的fabfile:
def deploy_2_dev():
deploy('dev')
def deploy_2_staging():
deploy('staging')
def deploy_2_prod():
deploy('prod')
def deploy(server):
print 'env.hosts:', env.hosts
env.hosts = [server]
print 'env.hosts:', env.hosts
Run Code Online (Sandbox Code Playgroud)
样本输出:
host:folder user$ fab deploy_2_dev
env.hosts: []
env.hosts: ['dev']
No hosts found. Please specify (single) host string for connection:
Run Code Online (Sandbox Code Playgroud)
当我创建Fabric文档中set_hosts()
显示的任务时,env.hosts设置正确.但是,这不是一个可行的选择,也不是装饰者.在命令行上传递主机最终会导致调用fabfile的某种shell脚本,我宁愿让一个工具正常工作.
它在Fabric文档中说'env.hosts只是一个Python列表对象'.根据我的观察,这根本不是真的.
谁能解释一下这里发生了什么?如何设置要部署的主机?
当我定义要在多个远程服务器上运行的任务时,如果任务在服务器1上运行并退出并出现错误,则Fabric将停止并中止该任务.但是我想让Fabric忽略错误并在下一个服务器上运行任务.我该怎么做呢?
例如:
$ fab site1_service_gw
[site1rpt1] Executing task 'site1_service_gw'
[site1fep1] run: echo 'Nm123!@#' | sudo -S route
[site1fep1] err:
[site1fep1] err: We trust you have received the usual lecture from the local System
[site1fep1] err: Administrator. It usually boils down to these three things:
[site1fep1] err:
[site1fep1] err: #1) Respect the privacy of others.
[site1fep1] err: #2) Think before you type.
[site1fep1] err: #3) With great power comes great responsibility.
[site1fep1] err: root's password:
[site1fep1] err: sudo: route: command not …
Run Code Online (Sandbox Code Playgroud) 我Fabric
无法识别我所拥有的主机~/.ssh/config
.
我的fabfile.py
情况如下:
from fabric.api import run, env
env.hosts = ['lulu']
def whoami():
run('whoami')
Run Code Online (Sandbox Code Playgroud)
跑步$ fab whoami
给出:
[lulu]跑:whoami
致命错误:lulu的名称查找失败
这个名字lulu
在我的~/.ssh/config
,就像这样:
Host lulu
hostname 192.168.100.100
port 2100
IdentityFile ~/.ssh/lulu-key
Run Code Online (Sandbox Code Playgroud)
我首先想到的解决,这是添加类似lulu.lulu
以/etc/hosts
(我在Mac),但后来我不得不在身份文件还传递给面料-我宁愿让我的认证(即~/.ssh/config
)从我的部署分开(即fabfile.py
).
顺便说一句,顺便说一句,如果你试图连接到hosts文件中的主机,fabric.contrib.projects.rsync_project
似乎并没有确认"端口" hosts.env
(即如果你使用hosts.env = [lulu:2100]
呼叫rsync_project
似乎尝试连接lulu:21
).
Fabric有没有认识这个lulu
名字的原因?
我在本地计算机上有一个目录,我想使用Fabric将其复制到远程计算机(并重命名).我知道我可以使用复制文件put()
,但是目录呢.我知道使用scp很容易,但fabfile.py
如果可能的话,我宁愿在我内部做到这一点.
我正在尝试编写一个可以执行的结构脚本git commit
; 但是,如果没有提交,git退出状态为1
.部署脚本将其视为不成功,并退出.我确实想要检测实际的失败提交,所以我不能仅仅给织物一个忽略git commit
失败的问题.如何允许忽略空提交失败,以便部署可以继续,但仍然捕获真正提交失败时导致的错误?
def commit():
local("git add -p && git commit")
Run Code Online (Sandbox Code Playgroud) 您的设置,技巧以及最重要的工作流程是什么?
这些工具很棒但是仍然没有附加到它们的最佳实践,因此我不知道使用它们的最有效方法是什么.
--no-site-packages
吗?通常,只要run()调用返回非零退出代码,Fabric就会退出.但是,对于某些电话,这是预期的.例如,PNGOut在无法压缩文件时返回错误代码2.
目前我只能通过使用shell逻辑(do_something_that_fails || true
或do_something_that_fails || do_something_else
)来绕过这个限制,但我宁愿能够将我的逻辑保存在普通的Python中(就像Fabric承诺一样).
有没有办法检查错误代码并对其做出反应而不是让Fabric出现恐慌并死掉?我仍然想要其他调用的默认行为,因此通过修改环境来改变它的行为似乎不是一个好的选择(据我所知,你只能使用它来告诉它警告而不是死亡).