2016-07-09 3 views
2

У меня есть скрипт Python, который использует Fabric для запуска тестов на удаленных хостах, получения файла otuput тестов и выполнения некоторого разбора. Сценарий Python не является файловым.Как выдавать команды на удаленных хостах параллельно с использованием Fabric без использования fabfile?

Я хотел бы запустить и запустить тесты параллельно. Я читал об использовании декоратора «@parallel», но все примеры, которые я прочитал, имеют сценарий как fabfile.

Мой код-то вроде этого:

from fabric.api import * 

# Copy the testfile on each of the hosts. This is sequential, it could be 
# done in parallel but doing it in parallel is not that important 
def copy_test(host_list, testfile_name): 
    for x in host_list: 
     env['host_string'] = x 

     target_testfile_name = "/tmp/" + testfile_name 

     put(testfile_name, target_testfile_name) 


@parallel # Would this decorator work? 
def run_test(host_list, testfile_name): 

    target_testfile_name = "/tmp/" + testfile_name 
    for x in host_list: 
     env['host_string'] = x 
     run(target_testfile_name) 


if __name__ == '__main__': 

    HOSTS = ['10.10.10.10', '10.10.10.11', '10.10.10.12', '10.10.10.13'] 

    testfile_name = "foo.py" 

    copy_test(HOSTS, testfile_name) 

    # I would like to launch run_test() in parallel 
    run_test(HOSTS, testfile_name)   

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

«потрясающего -НА '10 .10.10.10' copy_test»

"ФАБ -H '10 .10.10.10' run_test" -P

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

Как вы можете видеть, я не запускаю это как файл.

Есть ли способ, которым я мог бы выполнить run_test(), используя модель параллельного выполнения Fabric, не выполняя мой скрипт как «fabfile»?

ответ

0

Я не могу комментировать, так что я надену изменить ответ ваш главный на:

if __name__ == '__main__': 

    HOSTS = ['10.10.10.10', '10.10.10.11', '10.10.10.12', '10.10.10.13'] 

    testfile_name = "foo.py" 

    execute(copy_test,HOSTS, testfile_name) 

    # I would like to launch run_test() in parallel 
    execute(run_test,HOSTS, testfile_name)  

, если вы звоните в fonction с execute() и ваш fonction имеет @parallel он будет запущен параллельно

+0

Что-то еще, вы знаете о переменной среды ткани? Поскольку вы можете сохранить свой список хостов в 'env.hosts', а затем вам не придется передавать их в качестве аргументов – pwnsauce

+0

pwnsauce, спасибо за предложение. Я попробую его и посмотрю, разрешит ли он мою проблему. – SQA777