我真的需要这个以某种方式工作:
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。*的值,并且只要在函数(或类)结构中构造我的代码就会忽略它。
谢谢!
答案 0 :(得分:1)
不要使用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 /')
答案 1 :(得分:1)
所以答案是right in the docs。我没有看到它,因为Google总是找到旧版本的文档,我不知道为什么。
主要问题确实是env.hosts
的传播(其他env。*值似乎正常传播。使用任意主机列表调用方法的解决方案是使用{{1}调用它}。
例如:
execute(<someFunction>, hosts=<someHostList>)
使用以下命令运行:from fabric.api import env, run, execute
def f1():
someList = ['remoteHost1','remoteHost2']
execute(f2, hosts=someList)
def f2():
run('ls /')
。
编辑:更新版本
答案 2 :(得分:1)
使用我的亚马逊机器:
from fabric.api import env, sudo
def set_env():
env.host_string = "myuser@myhost"
env.key_filename = "myfile.pem"
# run commands
sudo("ls /")
答案 3 :(得分:0)
你应该尝试这样的事情:
def test():
with settings(user='vagrant', host_string='localhost',...):
run('ls /')
答案 4 :(得分:0)
根据我的发现,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 /')
但是,我不确定这些信息是否合适,而且我无法对其进行测试。
答案 5 :(得分:0)
这根本不是一个结构问题,虽然你可以通过这种方式解决问题,但你最好不要这样做。 SSH确实有更好的工具来管理这个问题,以及扩展到更复杂的设置。
首先设置备用SSH配置文件,或将其添加到~/.ssh/config
Host myvagrant
HostName 127.0.0.1
Port 2222
User vagrant
IdentityFile /Users/sscarduzio/.vagrant.d/insecure_private_key
此时你应该能够进入myvagrant
$ 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 /')