找不到主机:Fabric

时间:2011-04-03 15:53:04

标签: python fabric

当我运行我的python代码时,它要求主机。

  

找不到主机。请指定(单个)主机字符串以进行连接:

我有以下代码:

from fabric.api import *
from fabric.contrib.console import confirm

env.hosts = [ 'ipaddress' ]

def remoteRun():
    print "ENV %s" %(env.hosts)
    out = run('uname -r')
    print "Output %s"%(out)

remoteRun();

我甚至尝试使用-H选项运行fab,我收到相同的消息。我正在使用Ubuntu 10.10任何帮助表示赞赏。顺便说一下,我是Python的新手。

6 个答案:

答案 0 :(得分:15)

如果只有一个主机,则可以使用env.host_string = 'somehost or ipaddress'

您还不需要;末尾的remoteRun

from __future__ import with_statement
from fabric.api import *
from fabric.contrib.console import confirm
from fabric.api import env, run

env.host_string = 'ipaddress'

def remoteRun():
    print "ENV %s" %(env.hosts)
    out = run('uname -r')
    print "Output %s"%(out)

remoteRun()

答案 1 :(得分:15)

为了让主机在fab命令行工具和fabfile.py之外的脚本中工作,you'll have to use execute()

from fabric.api import run
from fabric.tasks import execute

def mytask():
    run('uname -a')

results = execute(mytask)

答案 2 :(得分:6)

我不确定remoteRun();在你的例子中应该做什么。

它是fabfile的一部分还是这是调用脚本的终端命令?

正确的方法是在shell中使用这样的命令:

fab remoteRun

通常最好指定命令应该运行的具体主机,如下所示:

def localhost():
    env.hosts = [ '127.0.0.1']

def remoteRun():
    print "ENV %s" %(env.hosts)
    out = run('uname -r')
    print "Output %s"%(out)

您可以从终端运行它(假设您位于包含fabfile的目录中):

fab localhost remoteRun

作为替代方法,您可以使用-H参数指定主机:

fab -H 127.0.0.1 remoteRun

如果您有要为其调用命令的主机列表,请执行以下操作: http://readthedocs.org/docs/fabric/latest/usage/execution.html

调整到您的示例:

env.hosts = [ 'localhost', '127.0.0.1']

def remoteRun():
    print "ENV %s" %(env.hosts)
    out = run('uname -r')
    print "Output %s"%(out)

通过:fab remoteRun

调用

这样remoteRun的所有主机都会执行env.hosts

答案 3 :(得分:5)

@Nerdatastic是对的,简单来说:不要使用env.hosts,而是使用env.host_string。 e.g。

def setup_db_server
  env.host_string = 'db01.yoursite.com'   # or the ip address
  run("mysqladmin ...")
end 

并且运行$ fab setup_db_server将在目标服务器上执行脚本。

答案 4 :(得分:4)

Nerdatastic是正确的,您需要为fabric指定env.host_string,以了解要使用的主机字符串。我遇到了这个问题,试图使用Task的子类并调用run()方法。它似乎忽略了env.hosts,除了在1.3版本中使用fabric.tasks中的execute。

答案 5 :(得分:0)

我有同样的问题。

我认为这是一个错误。因为今天之前所有工作。 我将我的环境存储在.fabricrc中。

现在我和你的信息相同。不知道为什么。