将文件从Chef客户端节点复制到工作站

时间:2013-09-12 00:39:46

标签: ruby-on-rails chef scp chef-recipe

我想知道如何将文件从客户端节点传输到远程计算机。我已经检查过是否有可用的资源。我找到的最接近的是remote_file,但是它从远程位置获取文件并将其传输到客户端节点。

所以我通过编写一个执行自动scp的bash脚本尝试了另一个选项。但是我无法复制文件,但是厨师 - 客户端运行良好而没有显示任何错误。

这是我复制文件的脚本:

#!/usr/bin/expect -f

# connect via scp
spawn scp "/tmp/testfile" chef-ws@10.232.110.113:/home/chef-ws/fileserver

expect {
-re ".*es.*o.*" {
exp_send "yes\r"
exp_continue
}
-re ".*sword.*" {
exp_send "password\r"
}
}
interact

我已在cookbook's templates目录中将此脚本复制为automatecopy.erb,然后在default.rb中,我有以下代码

template "/tmp/automatecopy" do
  source "automatecopy.erb"
  mode 0777
end

execute "automatecopy" do
  command "/usr/bin/expect /tmp/automatecopy"
  timeout 100
  action :run
end

此处,chef-client成功运行,但文件未复制到我的工作站计算机。还有一件事是,当我登录到我的客户端节点并从那里运行脚本时,它正在工作。那么为什么厨师失败呢?

请帮我解决这个问题,建议可能有什么问题,或者是否有可用于将文件从客户端复制到工作站的内置主厨资源。

P.S:我的工作站和客户端节点都运行Ubuntu 12.04。 提前谢谢。

1 个答案:

答案 0 :(得分:1)

我找到了解决方法。感谢此SO post,这与我的需求相似,我发现使用了sshpass代替expect。所以我改变了我的脚本,如下所示,现在厨师很高兴并且复制...... :)

使用sshpass修改脚本

#!/bin/bash

#Copy file from client's source path to workstation's dest path
sshpass -p <%= @password%> scp -o StrictHostKeyChecking=no <%= @sourcefile%> <%= @user%>@<%= @ip%>:<%= @destinationpath%>

并在default.rb

template "/tmp/automatecopy" do
  source "automatecopy.erb"
  mode 0777
  variables(
       :user=> "chef-ws",
       :ip=> "10.232.110.113",
       :sourcefile=> "/tmp/outfile",
       :destinationpath => "/home/chef-ws/fileserver",
       :password=> "pass"
  )
end
相关问题