在结构脚本中更新主机

2024-04-25 02:06:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试在fabric中循环所有服务器配置,并获得如下主机名:

from fabric.api import env, run

def serv_foo():
    env.hosts = ['bla@example.com']

def serv_bar():
    env.hosts = ['bla@example2.com']

def get_all_servers():
    return {(k,v) for k,v in globals().items() if k.startswith("serv_")}

def get_hostnames():
    for serv_name, serv_fptr in get_all_servers():
        print(env.hosts)
        serv_fptr()
        print(env.hosts)
        hostname = run("hostname")
        print(hostname)

但是,这样做失败了:

>>> fab get_hostnames

>>> []
>>> ['bla@example.com']
>>> No hosts found. Please specify (single) host string for connection: 

如何在结构中动态更新主机?你知道吗

  • 注1:我知道默认调用是fab serv_foo get_hostnames。对此不感兴趣。你知道吗
  • 注2:execute(serv_fptr)给出了相同的问题。你知道吗

Tags: runenvcomforgetfoodefhostname
1条回答
网友
1楼 · 发布于 2024-04-25 02:06:41

应该使用executerun命令设置主机:

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


def serv_foo():
    return ['bla@example.com']


def serv_bar():
    return ['bla@example2.com']


def get_all_servers():
    return {(k, v) for k, v in globals().items() if k.startswith("serv_")}


def get_hostname():
    return run("hostname")


def get_hostnames():
    for serv_name, serv_fptr in get_all_servers():
        print(env.hosts)
        hostname = execute(get_hostname, hosts=serv_fptr())
        print(hostname)

settings上下文管理器:

from fabric.api import run
from fabric.context_managers import settings


def serv_foo():
    return 'bla@example.com'


def serv_bar():
    return 'bla@example2.com'


def get_all_servers():
    return {(k, v) for k, v in globals().items() if k.startswith("serv_")}


def get_hostnames():
    for serv_name, serv_fptr in get_all_servers():
        with settings(host_string=serv_fptr()):
            hostname = run("hostname")
            print(hostname)

希望有帮助。你知道吗

相关问题 更多 >