如何在Fabric(Python)中定义多个服务器环境?

发布于 2024-12-25 07:13:54 字数 1600 浏览 0 评论 0原文

我需要使用 Fabric 在网站中执行一些操作,使用一台计算机作为文件系统,另一台计算机作为数据库服务器。我需要处理两个主机。我怎样才能做到这一点?

我有一些代码,但我无法让环境定义起作用。

其想法是连接到远程文件系统服务器并获取文件,然后连接到远程数据库服务器并获取数据库架构。

我现在的代码是这样的:

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

'''
Here I define where is my "aid"s file structure
'''
local_root = '/home/andre/test' # This is the root folder for the audits 
code_location = '/remote_code' # This is the root folder dor the customer code inside each audit


#
# ENVIRONMENTS CONFIGURATIONS
#
'''
Here I configure where is the remote file server
'''
def file_server():
    env.user = 'andre'
    env.hosts = ['localhost']

'''
Here I configure where is the database server
'''
def database_server():
    env.user = 'andre'
    env.hosts = ['192.168.5.1']  


#
# START SCRIPT
#
def get_install(remote_location, aid):
    ### I will get the files
    '''
    Here I need to load the file_server() definitions
    '''    
    working_folder = local_root + '/%s' % aid # I will define the working folder 
    local('mkdir ' + working_folder) # I will create the working folder for this audit
    local('mkdir ' + working_folder + code_location) # I will create the folder to receive the code
    get(remote_location, working_folder + code_location) # I will download the code to my machine
    ### I will get the database
    '''
    Here I need to load the database_server() definitions
    ''' 
    local('dir') # Just to test

How can I inside get_install()定义环境file_server()和database_server()?

此致,

I need to use Fabric to do some operations in a website that use one machine for the filesystem and other machine to the database server. I need to handle two hosts. How can I do that?

I have some code but I cannot get the environment definition to work.

The idea is to connect to the remote Filesystem server and get the files and then connect to the remote Database server and get the database schema.

The code that I have for now is something like this:

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

'''
Here I define where is my "aid"s file structure
'''
local_root = '/home/andre/test' # This is the root folder for the audits 
code_location = '/remote_code' # This is the root folder dor the customer code inside each audit


#
# ENVIRONMENTS CONFIGURATIONS
#
'''
Here I configure where is the remote file server
'''
def file_server():
    env.user = 'andre'
    env.hosts = ['localhost']

'''
Here I configure where is the database server
'''
def database_server():
    env.user = 'andre'
    env.hosts = ['192.168.5.1']  


#
# START SCRIPT
#
def get_install(remote_location, aid):
    ### I will get the files
    '''
    Here I need to load the file_server() definitions
    '''    
    working_folder = local_root + '/%s' % aid # I will define the working folder 
    local('mkdir ' + working_folder) # I will create the working folder for this audit
    local('mkdir ' + working_folder + code_location) # I will create the folder to receive the code
    get(remote_location, working_folder + code_location) # I will download the code to my machine
    ### I will get the database
    '''
    Here I need to load the database_server() definitions
    ''' 
    local('dir') # Just to test

How can I inside get_install() define the environments file_server() and database_server() ?

Best Regards,

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

只是我以为 2025-01-01 07:13:54

我不明白你到底想做什么,但也许你可以将 get_install 函数分成两个函数,每个函数对应每个服务器。

然后使用fabric.decorators.hosts(*host_list)装饰器将这些函数限制到正确的服务器:

例如,以下内容将确保,除非在命令行上进行覆盖,否则my_func将在host1、host2和host3上运行,并且host1 和 host3 上的特定用户:(

@hosts('user1@host1', 'host2', 'user2@host3')
def my_func():
    pass

有关详细信息,请参阅 http://readthedocs.org/docs /fabric/en/1.1.0/api/core/decorators.html#fabric.decorators.hosts

然后您可以通过将 get_install 方法定义为以下方式一次性调用这两个函数:

def get_install():
    func1()
    func2()

I don't understand exactly what you are trying to do, but maybe you can split up your get_install function into two functions each for every server.

Then limit those functions to the correct servers with fabric.decorators.hosts(*host_list) decorator:

For example, the following will ensure that, barring an override on the command line, my_func will be run on host1, host2 and host3, and with specific users on host1 and host3:

@hosts('user1@host1', 'host2', 'user2@host3')
def my_func():
    pass

(For more info see http://readthedocs.org/docs/fabric/en/1.1.0/api/core/decorators.html#fabric.decorators.hosts)

And you can than call those 2 functions in one go by defining your get_install method as:

def get_install():
    func1()
    func2()
萌无敌 2025-01-01 07:13:54

您应该能够使用 fab database_server get_install 来完成此操作。基本上, fab [环境] [命令] 应该做你想做的事。

You should be able to do this with fab database_server get_install. Basically, fab [environment] [command] should do what you want.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文