为什么我不能在函数内更改env.hosts?

时间:2013-12-11 12:10:15

标签: python fabric

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

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。*的值,并且只要在函数(或类)结构中构造我的代码就会忽略它。

谢谢!

6 个答案:

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