Назначение переменной на удаленном сервере с помощью команды оболочки через скрипт Ruby не работает - PullRequest
0 голосов
/ 06 февраля 2020

Я должен выполнить команду оболочки через сценарий ruby на нескольких серверах, где сценарий ruby будет выполнять S SH на сервере и затем запускать его. Я могу запустить скрипт до назначения переменных на удаленном компьютере, а затем выдает неправильные результаты, потому что назначение переменных в строке 15 не работает. Ниже приведен код:

1:require 'open3'
2:require 'net/ssh'
3:require 'fileutils'

4:HOME_PATH = "/road/street/home/"
5:HOME_TAR_FILE = "#{HOME_PATH}/dinner.tar.gz"
6:HOME_REPO = "/road/xyz/abc/dinner.tar.gz"
7:HOME_SOFT = "#{HOME_PATH}home-latest"

8:def home_build_processing(server,user)
9:  Net::SSH.start(server, user) do |ssh|
10:    ssh.exec!("scp server123:#{HOME_REPO} #{HOME_PATH}")
11:    puts "************** Download Completed ****************"
12:    ssh.exec!("tar -C #{HOME_PATH} -xvzf #{HOME_TAR_FILE}")
13:    ssh.exec!("rm -rf #{HOME_TAR_FILE}")
14:    ssh.exec!("cd #{HOME_PATH}; home_latest=$(ls -td -- */ | head -n 1 | cut -d'/' -f1)") 
15:    ssh.exec!("cd #{HOME_PATH}; home_version=$(echo $home_latest'_'$(date +%Y-%m-%d))")
16:    ssh.exec!("cd #{HOME_PATH}; mv $home_latest $home_version")
17:    puts "************** Processing Symlink**********************"
18:    ssh.exec!("cd #{HOME_PATH}; ln -sfnv $home_version #{HOME_SOFT}")
19:  end
20: end


home_build_processing(server1,user1)
home_build_processing(server2,user2)

Ошибка: строка 15 home_latest не имеет значения

Ответы [ 2 ]

0 голосов
/ 07 февраля 2020

Исходный код net -s sh:

exec! такой же, как exe c, за исключением того, что он будет блокироваться до завершения команды. Кроме того, если блок не указан, все выходные данные (stdout и stderr) будут возвращаться в виде одной строки. matches = ssh.exec!("grep something /some/files") возвращаемая строка имеет метод exitstatus для запроса его выхода.

Попробуйте что-то вроде этого

def home_build_processing(server, user)
  Net::SSH.start(server, user) do |ssh|
    ssh.exec!("scp server123:#{HOME_REPO} #{HOME_PATH}")
    puts "************** Download Completed ****************"
    ssh.exec!("tar -C #{HOME_PATH} -xvzf #{HOME_TAR_FILE}")
    ssh.exec!("rm -rf #{HOME_TAR_FILE}")
    home_latest = ssh.exec!("cd #{HOME_PATH}; echo $(ls -td -- */ | head -n 1 | cut -d'/' -f1)")
    home_version = ssh.exec!("cd #{HOME_PATH}; echo #{home_latest}'_'$(date +%Y-%m-%d)")
    ssh.exec!("cd #{HOME_PATH}; mv #{home_latest} #{home_version}")
    puts "************** Processing Symlink**********************"
    ssh.exec!("cd #{HOME_PATH}; ln -sfnv #{home_version} #{HOME_SOFT}")
  end
end
0 голосов
/ 06 февраля 2020

потому что каждый exe c является сессией. Предыдущая переменная уже пропала. Вы можете отправить команду в виде цепочки, используя &&

"cd #{HOME_PATH}; home_latest=$(ls -td -- */ | head -n 1 | cut -d'/' -f1) && home_version=$(echo $home_latest'...

ссылка: net -s sh

...