У меня есть один сценарий файла для автоматизации операций (загрузка файлов журналов, остановка/запуск нескольких контейнеров. Пользователь выбирает, что делать с помощью аргументов команды) и хотите иметь функции ткани в тот же скрипт, а также класс разбора аргументов и, возможно, некоторые другие. Как мне вызвать функции ткани из одного и того же сценария 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)
Спасибо за ответ, но он по-прежнему заканчивается так: Фатальная ошибка: Необходим для запроса строки подключения конечного узла (хоста: Нет). arParser(). argParse() - это не-тканевая функция, поэтому я оставил ее как есть и добавил выполнение в функцию ihsstate(). Я полагаю, что ему нужно «выполнить» функцию ткани с некоторым параметром «настройки». – panta
@panta: да, вам нужно определить env.hosts. Вы можете сначала выполнить функцию ткани, которая определяет это, а затем вызывать самые лучшие из ваших сценариев. – RickyA
Еще раз спасибо за ваш ответ, это очень ценится. Я тоже пробовал это без успеха. env.hosts установлены должным образом (если я добавляю print env.hosts непосредственно перед частью «запуска» функции ткани, он печатает правильно), но вся операция по-прежнему не выполняется «Требуется вызвать строку подключения целевого хоста (host: None) ». Я отредактирую вопрос для дальнейшего описания того, что происходит внутри функции fab. – panta