2013-09-03 2 views
0

У меня есть один сценарий файла для автоматизации операций (загрузка файлов журналов, остановка/запуск нескольких контейнеров. Пользователь выбирает, что делать с помощью аргументов команды) и хотите иметь функции ткани в тот же скрипт, а также класс разбора аргументов и, возможно, некоторые другие. Как мне вызвать функции ткани из одного и того же сценария python? Я не хочу использовать «fab», как есть.Вызов python Функции Fabric из одного и того же сценария

И как побочное примечание, я бы хотел, чтобы эти вызовы были параллельными.

Это модель класса, который бы идеально содержать все необходимые ткани функции:

class fabricFuncs: 
    def appstate(self): 
    env.hosts = hosts 
    run('sudo /home/user/XXX.sh state') 

Это пусковая секция:

if __name__ == "__main__": 
    argParser().argParse() 
    fabricFuncs().ihsstate() 

argParser устанавливает переменные globaly, используя аргументы из командной строки, указанные (только для уточнения что эта часть делает). которые, к сожалению приводит к неудаче, где не определены хозяева (env.hosts должны содержать, что внутри функции ... или это слишком поздно, чтобы объявить их там?)

EDIT1: Я пытался запускать функцию ткани используя это:

for h in env.hosts: 
    with settings(hosts_string=user + "@" + h): 
    fabricFuncs().ihsstate() 

Это вид работ. Я как бы надеялся, что, я смогу парализовать весь процесс с использованием тканевого модуля, как он есть (через декораторов), не повредив все это в коде потока.

EDIT2: Я попытался это так:

execute(fabricFuncs().ihsstate()) 

Который терпит неудачу с:

Fatal error: Needed to prompt for the target host connection string (host: None) 

Может ли я поставить все env.hosts переменного в "Настройку" выше без итерации, что список с выражением «для»?

EDIT3: Я попытался редактирования ФАБ функции, как это, чтобы увидеть, если env.hosts установлены правильно:

class fabricFuncs: 
    def appstate(self): 
    env.hosts = hosts 
    print env.hosts 
    run('sudo /home/user/XXX.sh state') 

И печатает правильно, но все-таки «запустить» команда не выполняется:

Fatal error: Needed to prompt for the target host connection string (host: None) 

ответ

1

Используйте execute команду:

from fabric.api import execute 

execute(argParser().argParse()) 
execute(fabricFuncs().ihsstate()) 
+0

Спасибо за ответ, но он по-прежнему заканчивается так: Фатальная ошибка: Необходим для запроса строки подключения конечного узла (хоста: Нет). arParser(). argParse() - это не-тканевая функция, поэтому я оставил ее как есть и добавил выполнение в функцию ihsstate(). Я полагаю, что ему нужно «выполнить» функцию ткани с некоторым параметром «настройки». – panta

+0

@panta: да, вам нужно определить env.hosts. Вы можете сначала выполнить функцию ткани, которая определяет это, а затем вызывать самые лучшие из ваших сценариев. – RickyA

+0

Еще раз спасибо за ваш ответ, это очень ценится. Я тоже пробовал это без успеха. env.hosts установлены должным образом (если я добавляю print env.hosts непосредственно перед частью «запуска» функции ткани, он печатает правильно), но вся операция по-прежнему не выполняется «Требуется вызвать строку подключения целевого хоста (host: None) ». Я отредактирую вопрос для дальнейшего описания того, что происходит внутри функции fab. – panta

0

, если вы запустите скрипт без команды fab, env.host установит значение None.
поэтому, если вы хотите использовать 'execute', вам необходимо передать также параметр hosts.

попробовать это:

from fabric.api import execute, run 
if __name__ == "__main__": 
    hosts = ["host1", "host2"] 
    execute(run('sudo /home/user/XXX.sh state'), hosts=hosts)