2015-06-09 6 views
0

У меня есть приложение Java, которое должно взаимодействовать с агентами Python, установленными на удаленных компьютерах. Мое основное приложение имеет SSH доступ к этим удаленным машинам. Чтобы упростить работу пользователя, я хочу автоматизировать процесс установки агента, поэтому пользователь может просто нажать кнопку, а главное приложение подключается, устанавливает и запускает приложение удаленно.Автоматизация установки приложения Python

Я ожидаю, что:

  • пультов ДУ будет отличаться UNIX сейчас (Windows затем);
  • Пользователь SSH не может быть root;
  • Python установлен на удаленной машине;
  • Удаленный компьютер может не иметь подключения к Интернету.

Мои агенты Python используют virtualenv и pip, имеют количество зависимостей. Я сделал скрипт для загрузки virtualenv и зависимостей, как tar.gz/zip:

#!/usr/bin/env bash 

# Should be the same in dist.sh and install_dist.sh. 
VIRTUALENV_VERSION=13.0.3 
VIRTUALENV_BASE_URL=https://pypi.python.org/packages/source/v/virtualenv 

echo "Recreating dist directory..." 

if [ -d "dist" ]; then 
    rm -rf dist 
fi 
mkdir -p dist 

echo "Copying agent sources..." 

cp -r src dist 
cp requirements.txt dist 
cp agent.sh dist 
cp install_dist.sh dist 


echo "Downloading virtualenv..." 

curl -o dist/virtualenv-$VIRTUALENV_VERSION.tar.gz -O $VIRTUALENV_BASE_URL/virtualenv-$VIRTUALENV_VERSION.tar.gz 

echo "Downloading requirements..." 

mkdir dist/libs 
./env/bin/pip install --download="dist/libs" --no-binary :all: -r requirements.txt 

echo "Packing dist directory..." 
tar cvzf dist.tar.gz dist 

Когда начинается установка, мои главное приложение УППЫ все это архив на удаленную машину, устанавливает virtualenv и требование, скопируйте все необходимые скрипты :

#!/usr/bin/env bash 

# Runs remotely. 

SCRIPT_DIR="`dirname \"$0\"`" 
SCRIPT_DIR="`(cd \"$SCRIPT_DIR\" && pwd)`" 
HOME_DIR="`(cd \"$SCRIPT_DIR/..\" && pwd)`" 

VIRTUALENV_VERSION=13.0.3 

echo "Installing virtualenv..." 

tar xzf $SCRIPT_DIR/virtualenv-$VIRTUALENV_VERSION.tar.gz --directory $SCRIPT_DIR 
python $SCRIPT_DIR/virtualenv-$VIRTUALENV_VERSION/virtualenv.py $HOME_DIR/env 
if [ $? -ne 0 ] 
then 
    echo "Unable to create virtualenv." 
    exit 1 
fi 

$HOME_DIR/env/bin/pip install $SCRIPT_DIR/virtualenv-$VIRTUALENV_VERSION.tar.gz 
if [ $? -ne 0 ] 
then 
    echo "Unable to install virtualenv." 
    exit 1 
fi 

echo "Installing requirements..." 

$HOME_DIR/env/bin/pip install --no-index --find-links="$SCRIPT_DIR/libs" -r $SCRIPT_DIR/requirements.txt 
if [ $? -ne 0 ] 
then 
    echo "Unable to install requirements." 
    exit 1 
fi 

echo "Copying agent sources..." 

cp -r $SCRIPT_DIR/src $HOME_DIR 
if [ $? -ne 0 ] 
then 
    echo "Unable to copy agent sources." 
    exit 1 
fi 
cp -r $SCRIPT_DIR/agent.sh $HOME_DIR 
if [ $? -ne 0 ] 
then 
    echo "Unable to copy agent.sh." 
    exit 1 
fi 
cp -r $SCRIPT_DIR/requirements.txt $HOME_DIR 

echo "Cleaning installation files..." 
rm -rf $HOME_DIR/dist.tar.gz 
rm -rf $SCRIPT_DIR 

я столкнулся с проблемой с созданием некоторых зависимостей дистанционно - например, они могут потребовать GCC или другие библиотеки, которые должны быть установлены вручную с Судо ... может быть, я должен использовать предварительно скомпилированных колеса где это возможно, обеспечивая их по каждой целевой системе? Или, может быть, вы видите лучший способ реализовать эту задачу?

+0

Возможно ли доставить полностью упакованные приложения? Посмотрите на [Freeze] (https://wiki.python.org/moin/Freeze) и [py2exe] (https://wiki.python.org/moin/Py2Exe). – Cyrbil

+0

Кроме того, если вы планировали доставку для среды Windows, обратите внимание, что компиляция требует много и очень раздражает, предпочитайте отправлять библиотеки, предварительно скомпилированные с вашим приложением. Для linux-среды, ну, в основном это зависит от среды, поэтому вы, вероятно, будете придерживаться структурных зависимостей. – Cyrbil

+0

Спасибо, @cyrbil.Похоже, что построение на этапе установки будет отличаться для разных систем и требует наличия библиотек, которые могут быть недоступны. С другой стороны, предоставление распределения для каждой целевой системы требует создания их на каждой целевой системе (как я вижу из документов cx_Freeze или PyInstaller). Дилемма. Пожалуйста, разместите свой комментарий в качестве ответа, чтобы я принял его. – Marboni

ответ

0

Возможно ли доставить полностью упакованные приложения? Посмотрите на Freeze и py2exe.

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

Примечание: Ваш комментарий:

обеспечение распределения для каждой целевой системы требует создания их на каждой целевой системе

Обратите внимание, что вы можете сделать кросс-компиляции, которые позволяют вам строить для другой системы (даже Windows), без необходимости работать с этой средой.
Я бы продолжил строительство с использованием кросс-компиляции. В худшем случае сценарий очень мало хостов будет раздражать и не сможет использовать ваши двоичные файлы. В этом случае просто решайте проблему в каждом конкретном случае.

Удачи :)