Hi All, 

I'm getting started with Fabric and am trying to work out how best to work with 
it in regards to my ssh config details. 

As is common, I have a ~/.ssh/config file with named blocks for Hostnames, 
Ports, Identity files and so on. In the first place I'd like to simply 
reference those named blocks in my fabfile and have it use those to determine 
the right details directly. I appreciate that this isn't currently supported 
but is (possibly) scheduled for the 1.0 or 1.1 release.

In the meantime I've been experimenting with putative solutions that Google 
throws up (see below) and this brings me to my second (and main) desire/want. 
It's obviously not ideal but, I don't really mind duplicating the info in my 
ssh config file file while I wait for/lend a hand in getting Fabric to use it. 
What I do want to be able to do is specify rememberable/readable shortcut names 
for hosts in the fabfile and on the command line rather than opaque IP address 
& port number combinations. 

So, on the command line I'd like something like: 

        $ fab -H my_site deploy

and in @hosts decorators I'd like something like: 

        @hosts('my_site')

Even if the actual hostname is more like:

        carl...@123.456.789.0:1234

I've put the necessary details in a dictionary with the nicknames as keys, 
which gives simple @hosts usage (at the cost of some duplication) but it 
doesn't get me the command line case. 

I guess I'm wondering how people handle this currently, and if there is any 
work that I can perhaps lend an eye to for implementing a solution here?


Below is just an example Google threw up parsing the ssh config file directly; 
however, it breaks the @hosts usage, which isn't ideal...

####### Extract from fabfile.py

env.hosts = ['my_site']

# An Example (first pass) solution found via Google...
# 
http://markpasc.typepad.com/blog/2010/04/loading-ssh-config-settings-for-fabric.html
#
# This parses my .ssh/config for the right information and updates env.hosts & 
env.key_filename accordingly.
# -- Trouble is it stops @hosts decorator using my preferred nicknames.
#
def annotate_hosts_with_ssh_config_info():
    def hostinfo(host, config):
        hive = config.lookup(host)
        host = hive['hostname']
        if 'user' in hive:
            host = '%...@%s' % (hive['user'], host)
        if 'port' in hive:
            host = '%s:%s' % (host, hive['port'])
        return host

    try:
        config_file = file(expanduser('~/.ssh/config'))
    except IOError:
        pass
    else:
        config = SSHConfig()
        config.parse(config_file)
        keys = [config.lookup(host).get('identityfile', None)
            for host in env.hosts]
        env.key_filename = [expanduser(key) for key in keys if key is not None]
        env.hosts = [hostinfo(host, config) for host in env.hosts]

annotate_hosts_with_ssh_config_info()

@hosts('my_site')
def my_func():
    run('uptime') # The trouble is this will now fail

######## End of Extract

So I try this from the cli and it fails (as expected): 

$ fab my_func
[my_site] Executing task 'my_func'
[my_site] run: uptime

Fatal error: Name lookup failed for sites1

Aborting.

I'm not sure what the best solution is in the short run. Perhaps just hardcode 
the ugly details and live with the difficulties?

Thanks for reading this far.

Regards,
Carlton
_______________________________________________
Fab-user mailing list
Fab-user@nongnu.org
http://lists.nongnu.org/mailman/listinfo/fab-user

Reply via email to