我真的需要它以某种方式工作:
from fabric.api import *
from fabric.contrib import *
def test():
global env
env.user = 'vagrant'
env.hosts = ['127.0.0.1', ]
env.port = 2222
env.key_filename = "/Users/sscarduzio/.vagrant.d/insecure_private_key"
run('ls /')
测试用例:
$ fab test
No hosts found. Please specify (single) host string for connection:
我不明白为什么在函数外更改env.*的值是可以的,而一旦在函数(或类)结构中构建我的代码,就会忽略它。
谢谢!
不要使用import *
,也不要使用全局变量。两者都没有必要。
from fabric.api import env, run
def test():
env.user = 'vagrant'
env.hosts = ['127.0.0.1', ]
env.port = 2222
env.key_filename = "/Users/sscarduzio/.vagrant.d/insecure_private_key"
run('ls /')
对于我使用的亚马逊机器:
from fabric.api import env, sudo
def set_env():
env.host_string = "myuser@myhost"
env.key_filename = "myfile.pem"
# run commands
sudo("ls /")
因此,文档中的答案是正确的。我没有看到它,因为谷歌总是能找到旧版本的文档,我不知道为什么。
主要问题实际上是env.hosts
的传播(其他env.*值似乎正常传播。调用具有任意主机列表的方法的解决方案是使用execute(<someFunction>, hosts=<someHostList>)
调用它。
例如:
from fabric.api import env, run, execute
def f1():
someList = ['remoteHost1','remoteHost2']
execute(f2, hosts=someList)
def f2():
run('ls /')
要使用命令运行:$ fab f1
。
EDIT:更新版本
你应该试试这样的东西:
def test():
with settings(user='vagrant', host_string='localhost',...):
run('ls /')
根据我的发现,env
需要项目访问而不是属性。
因此,做
from fabric.api import env, run
def test():
env['user'] = 'vagrant'
env['hosts'] = ['127.0.0.1', ]
env['port'] = 2222
env['key_filename'] = "/Users/sscarduzio/.vagrant.d/insecure_private_key"
run('ls /')
然而,我不确定这些信息是否正确,我也没有能力测试它。
这根本不是一个结构问题,尽管你可以用这种方式解决问题,但最好不要这样做。SSH确实有更好的工具来管理这个问题,并扩展到更复杂的设置。
首先设置一个备用SSH配置文件,或将其添加到~/.ssh/config
中
Host myvagrant
HostName 127.0.0.1
Port 2222
User vagrant
IdentityFile /Users/sscarduzio/.vagrant.d/insecure_private_key
到那时,您应该能够ssh到myfloatint
$ ssh myvagrant
或者:
$ ssh -F .ssh_config myvagrant
现在你的织物代码应该是:
from fabric.api import *
env.use_ssh_config = True
#env.ssh_config_path = '.ssh_config'
@task
def f2():
run('ls /')