为什么我不能从函数中更改env.hosts



我真的需要它以某种方式工作:

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 /')

最新更新