我遇到了sshsession Ant任务的问题。
我正在编写一个部署脚本,使用bzip源代码,将存档scp到远程服务器,然后解压缩远程服务器上的源代码并复制右目录树中的文件。
(...)
<bzip2 src="/tmp/${selected.target}.tar" destfile="/tmp/${selected.target}.tar.bz2"/>
<scp file="/tmp/${selected.target}.tar.bz2" todir="user@server:/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。 谢谢,
阿尔贝托
答案 0 :(得分:3)
我添加一个答案来说明我们如何使用remote-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)与“my-company-lib.jar”和“remote-build.xml”一起打包,然后使用{{1}传输存档文件}。
然后,sshexec“ant -f remote-build.xml run”(您可以将属性放在属性文件中,也可以在sshexec命令行中传输它们)。
答案 1 :(得分:1)
虽然这个问题并不是全新的,但我今天发现自己处于类似情况。我的目标是在我必须隧道(通过另一台服务器)的远程服务器上上传文件和运行命令。给出的答案(在远程服务器上需要ant)对我来说完全不能接受,但这里的评论帮助我打造了这个解决方案
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>