Does python fabric support dynamic set env.hosts?

前端 未结 3 1376
误落风尘
误落风尘 2021-02-04 01:41

I want to change the env.hosts dynamically because sometimes I want to deploy to one machine first, check if ok then deploy to many machines. Currently I need to set env.hosts f

3条回答
  •  不要未来只要你来
    2021-02-04 02:29

    Kind of late to the party, but I achieved this with ec2 like so (note in EC2 you do not know what the ip/hostname may be, generally speaking - so you almost have to go dynamic to really account for how the environment/systems could come up - another option would be to use dyndns, but then this would still be useful):

    from fabric.api import *
    import datetime
    import time
    import urllib2
    import ConfigParser
    from platform_util import *
    
    config = ConfigParser.RawConfigParser()
    
    @task
    def load_config(configfile=None):
        '''
        ***REQUIRED***  Pass in the configuration to use - usage load_config:
        '''
        if configfile != None:
            # Load up our config file
            config.read(configfile)
    
            # Key/secret needed for aws interaction with boto 
            # (anyone help figure out a better way to do this with sub modules, please don't say classes :-) )
            global aws_key
            global aws_sec
    
            aws_key = config.get("main","aws_key")
            aws_sec = config.get("main","aws_sec")
    
             # Stuff for fabric
            env.user                = config.get("main","fabric_ssh_user")
            env.key_filename        = config.get("main","fabric_ssh_key_filename")
            env.parallel            = config.get("main","fabric_default_parallel")
    
            # Load our role definitions for fabric
            for i in config.sections():
                if i != "main":
                    hostlist = []
                    if config.get(i,"use-regex") == 'yes':
                        for x in get_running_instances_by_regex(aws_key,aws_sec,config.get(i,"security-group"),config.get(i,"pattern")):
                            hostlist.append(x.private_ip_address)   
                        env.roledefs[i] = hostlist
    
                    else:
                        for x in get_running_instances(aws_key,aws_sec,config.get(i,"security-group")):
                            hostlist.append(x.private_ip_address)   
                        env.roledefs[i] = hostlist
    
                    if config.has_option(i,"base-group"):
                        if config.get(i,"base-group") == 'yes':
                            print "%s is a base group" % i
                            print env.roledefs[i]
    #                       env["basegroups"][i] = True
    

    where get_running_instances and get_running_instances_by_regex are utility functions that make use of boto (http://code.google.com/p/boto/)

    ex:

    import logging
    import re
    from boto.ec2.connection import EC2Connection
    from boto.ec2.securitygroup import SecurityGroup
    from boto.ec2.instance import Instance
    from boto.s3.key import Key
    
    ########################################
    # B-O-F get_instances
    ########################################
    def get_instances(access_key=None, secret_key=None, security_group=None):
        '''
        Get all instances. Only within a security group if specified., doesnt' matter their state (running/stopped/etc)
        '''
        logging.debug('get_instances()')
        conn = EC2Connection(aws_access_key_id=access_key, aws_secret_access_key=secret_key)
    
        if security_group:
            sg = SecurityGroup(connection=conn, name=security_group)
            instances = sg.instances()
            return instances
        else:
            instances = conn.get_all_instances()
            return instances
    

    Here is a sample of what my config looked like:

    # Config file for fabric toolset
    #
    #  This specific configuration is for  related hosts
    #  
    #
    [main]
    aws_key = 
    aws_sec = 
    fabric_ssh_user = 
    fabric_ssh_key_filename = /path/to/your/.ssh/.pem
    fabric_default_parallel = 1
    
    #
    # Groupings - Fabric knows them as roledefs (check env dict)
    #
    
    # Production groupings
    [app-prod]
    security-group = app-prod
    use-regex = no
    pattern = 
    
    [db-prod]
    security-group = db-prod
    use-regex = no
    pattern = 
    
    [db-prod-masters]
    security-group = db-prod
    use-regex = yes
    pattern = mysql-[d-s]01
    

提交回复
热议问题