2011-12-14 2 views
2

У меня проблемы с sshsession Ant задача.Выполнение удаленных команд с помощью sshsession Ant task

Я пишу сценарий развертывания, который создает источники bzip, архивирует архив на удаленный сервер, а затем распакует источники на удаленном сервере и копирует файлы в нужное дерево каталогов.

(...) 

<bzip2 src="/tmp/${selected.target}.tar" destfile="/tmp/${selected.target}.tar.bz2"/> 
<scp file="/tmp/${selected.target}.tar.bz2" todir="[email protected]:/tmp/" keyfile="${user.home}/.ssh/id_rsa" trust="yes" passphrase="thisisasecret"/> 

<sshsession host="server" username="user" keyfile="${user.home}/.ssh/id_rsa" trust="yes"> 
    <sequential> 
     <untar src="/tmp/${selected.target}.tar.bz2" dest="/tmp/prova_untar" compression="bzip2"/> 
     (copy files) 
    </sequential> 
</sshsession> 

(...) 

Проблема с задачами, указанными внутри sshsession, поскольку они выполняются локально, а не на удаленном сервере. Я подумал (но ясно, что я ошибаюсь), что команда, указанная в теге sshsession, будет выполняться на сервере, к которому я только что подключен. Я прочитал в документации, что вы можете указать туннели с localtunnel и remotetunnel, но я не уверен, что правильно понимаю, для чего предназначены эти туннели. Кто-нибудь сталкивался с той же проблемой или имел решение для этого? Версия Ant, с которой я работаю, - 1.8.2. Спасибо,

Alberto

+0

я думаю, вам нужно использовать [sshexec] (https://ant.apache.org/manual/Tasks/sshexec.html). sshsession, похоже, для туннелирования соединений, а не для выполнения повторной передачи. – oers

+0

Спасибо. Я выбрал sshsession, потому что мне нужно выполнить список удаленных команд, и sshexec просто открывает новый сеанс каждый раз. – geezmo

+2

У нас есть аналогичная ситуация - выполнить список удаленных команд, и мы делаем это, чтобы написать «remote-build.xml» и скопировать его вместе с другими файлами на удаленную машину. Конечно, мы должны установить муравей в удаленную машину, но я думаю, что это нормально. – coolcfan

ответ

3

добавить ответ, чтобы показать, как мы используем удаленный_файл build.xml.

Например, мы хотим развернуть на сервере базы данных некоторые предварительно созданные SQL-файлы, вставить SQL-файлы в базу данных в MySQL и перезапустить mysql.

<?xml version="1.0" encoding="UTF-8"?> 
<project name="remote-build" basedir="."> 

    <target name="run"> 
     <antcall target="extract" /> 
     <antcall target="build-database" /> 
     <antcall target="restart-mysql" /> 
    </target> 

    <target name="extract"> 
     <unzip src="sample-sql.zip" dest="."/> 
    </target> 

    <target name="build-database"> 
     <taskdef name="insert" classname="my.company.ant.ParallelInsertSQL" classpath="my-company-lib.jar"/> 
     <insert dbName="${database.name}" masterSQLs="${basedir}/sample-sql.sql" sqlDir="${basedir}/tables"/> 
     <antcall target="restart-database"/> 
    </target> 

    <target name="restart-database"> 
     <exec executable="bash" inputstring="echo '${database.password}' | sudo -S /etc/init.d/mysql restart"/> 
    </target> 

</project> 

Так при развертывании, мы упаковали архив SQL файла (sample-sql.zip) вместе с «моей-компанией-lib.jar» и «дистанционным build.xml», а затем передать файл архив scp.
Затем sshexec «ant -f remote-build.xml run» (вы можете либо поместить свойства в файл свойств, либо передать их в командной строке sshexec).

+0

Хорошее обходное решение, к сожалению, вам придется установить муравей на удаленную машину, и это не всегда возможно в производственной среде и т. Д. Я думаю, что задача 'sshsession' вводит в заблуждение тем, что она не выполняет то, что вы ожидаете, что он будет выполнять удаленную работу с муравьями. Я задаюсь вопросом, есть ли задача или lib, способная достичь этой цели, поскольку она сделает материал намного чище, чем использование команд оболочки с помощью 'sshexec' – Michael

+0

@michael Если муравья не установлены на целевой машине, тогда мы можем развернуть что-то else, например, пакетный файл Windows или сценарий оболочки linux ... Я думаю, что трудно выполнить ant-задачи удаленно - для этого также должен быть установлен установленный муравей. – coolcfan

0

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

sshsession только создает туннель, который можно использовать для выполнения задач внутри. Задачи внутри не запускаются автоматически на удаленном сервере, но вы можете использовать задачу sshexec вместе с туннелем для достижения этого. Также задача scp теперь может загружаться через туннель на удаленный сервер. Вот пример:

<sshsession host="${jumphost}" port="22" username="${user}" password="${password}" trust="true"> 
    <localtunnel lport="${localTunnelPort}" rhost="${targethost}" rport="22"/> 
    <sequential> 
     <!-- run a command on the remote server (here mkdir) --> 
     <sshexec host="localhost" port="${localTunnelPort}" username="${user.param}" password="${password.param}" command="mkdir ${home}/foobar" trust="true" /> 
     <!-- upload a file to the remote server --> 
     <scp port="${localTunnelPort}" file="test_file.txt" todir="${user.param}:${password.param}@localhost:${home}/foobar/" trust="true" /> 
    </sequential> 
</sshsession> 
Смежные вопросы