开发者

No hosts found: Fabric

开发者 https://www.devze.com 2023-02-21 14:08 出处:网络
when I run my python code it isasking for host. No hosts found. Please specify (single) host string for connection:

when I run my python code it is asking for host.

No hosts found. Please specify (single) host string for connection:

I have the following code:

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();

I even tried running fab with -H option and I am getting the same message. I'm using Ubuntu 10.10 any help is appreciated. Btw I am a newbie in Python.


In order to get hosts to work in a script outside of the fab command-line tool and 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)


If it's only one host, you can use env.host_string = 'somehost or ipaddress'.

You also don’t need the ; at the end of your 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()


I am not exactly sure what remoteRun(); is supposed to do in your example.

Is it part of your fabfile or is this your terminal command to invoke the script?

The correct way would be a command like this in your shell:

fab remoteRun

Generally it's better to specify the concrete hosts your command is supposed to run on like this:

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

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

You can run it like this from a terminal (assuming you are in the directory that contains your fabfile):

fab localhost remoteRun

As an alternative you could specify the host with the -H parameter:

fab -H 127.0.0.1 remoteRun

If you have a list of hosts you want to invoke the command for, do it like this: http://readthedocs.org/docs/fabric/latest/usage/execution.html

Adjusted to your example:

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

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

And called via: fab remoteRun

This way the remoteRun is performed on all hosts in env.hosts.


@Nerdatastic is right, for simple: don't use env.hosts, use env.host_string instead. e.g.

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

and running $ fab setup_db_server will execute the script on the target server.


Nerdatastic is right, you need to specify the env.host_string varaible for fabric to know what host string to use. I came across this problem trying to use a subclass of Task and call the run() method. It seemed to ignore env.hosts except when using execute from fabric.tasks in version 1.3.


i have same issue.

I think this is a bug. Because all work before today. I store my env in .fabricrc.

Now i have same message as yours. Don't know why.

0

精彩评论

暂无评论...
验证码 换一张
取 消