У меня есть приложение 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 или другие библиотеки, которые должны быть установлены вручную с Судо ... может быть, я должен использовать предварительно скомпилированных колеса где это возможно, обеспечивая их по каждой целевой системе? Или, может быть, вы видите лучший способ реализовать эту задачу?
Возможно ли доставить полностью упакованные приложения? Посмотрите на [Freeze] (https://wiki.python.org/moin/Freeze) и [py2exe] (https://wiki.python.org/moin/Py2Exe). – Cyrbil
Кроме того, если вы планировали доставку для среды Windows, обратите внимание, что компиляция требует много и очень раздражает, предпочитайте отправлять библиотеки, предварительно скомпилированные с вашим приложением. Для linux-среды, ну, в основном это зависит от среды, поэтому вы, вероятно, будете придерживаться структурных зависимостей. – Cyrbil
Спасибо, @cyrbil.Похоже, что построение на этапе установки будет отличаться для разных систем и требует наличия библиотек, которые могут быть недоступны. С другой стороны, предоставление распределения для каждой целевой системы требует создания их на каждой целевой системе (как я вижу из документов cx_Freeze или PyInstaller). Дилемма. Пожалуйста, разместите свой комментарий в качестве ответа, чтобы я принял его. – Marboni