Предпочтительный способ автоматического обновления файла конфигурации SSH с использованием Python? - PullRequest
6 голосов
/ 06 декабря 2011

Я использую Fabric для автоматизации некоторых моих рабочих процессов, большая часть которых связана с манипулированием экземплярами EC2.

Я ищу способ поддерживать мой файл .ssh/config в актуальном состоянии., так как я регулярно запускаю и выключаю экземпляры EC2, и для меня очень полезно, если я могу легко использовать ssh для их отладки и т. д.

Записи в моем конфигурационном файле SSH выглядят так*

В данный момент я делаю что-то вроде следующего (использую Fabric и boto), что является откровенно глупым подходом:

def my_cool_spin_up_function(self):
    . . .
    . . .
    ssh_conf = os.path.join(homedir, '.ssh/config')
    ssh_info = '\n'.join(['Host %s'         % name,
                          'Hostname %s'     % ins.dns_name,
                          'User %s'         % env.user,
                          'IdentityFile %s' % kp_loc,
                          '\n'])
    w_com = 'echo %s | cat - %s | tee %s > /dev/null' % (ssh_info, ssh_conf, ssh_conf)
    local(w_com)

Как видите,это будет продолжать добавляться к моему файлу конфигурации каждый раз, когда он вызывается, и это нормально, потому что SSH берет первый раздел для каждого хоста в конфигурации, но это означает, что файл накапливается и увеличивается.,.

Мне интересно, есть ли какие-нибудь библиотеки Python, позволяющие обрабатывать .ssh/config как файл конфигурации, соответствующие части которого можно обновлять как и когда.Например, было бы замечательно, если бы вы могли просто трактовать .ssh/config как словарь и абстрагироваться от чтения / записи файла.,.

Спасибо за любые предложения!

Ответы [ 2 ]

7 голосов
/ 06 декабря 2011

Что мы делаем для такого рода конфигурации, так это поддерживаем каталог фрагментов конфигурации, который можно добавлять / удалять по мере необходимости, а затем делать что-то вроде:

cat .ssh/config.d/* > .ssh/config

Это добавит вещив лексическом порядке, что означает, что порядок зависит от того, как вы решите назвать свои файлы.Это позволяет очень легко истечь старые конфигурации, удалить определенные элементы и иным образом управлять файлом конфигурации.

0 голосов
/ 06 декабря 2011

Как насчет этого:

class SSHConfig(object):

    def __init__(self, filename=None):
        if filename is not None:
            self.read(filename)
        else:
            self.conf = dict()

    def read(self, filename):
        self.conf = dict(line.decode("utf-8").rstrip().split(" ", 1) for line in open(filename)) 

    def write(self, filename):
        with open(filename, "w") as f:
            for key, value in self.conf.items():
                f.write("%s %s\n".encode("utf-8") % (key, value))

    def set(self, key, value):
        self.conf[key] = value

    def get(self, key):
        return self.conf.get(key, None)
...