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

Posted

技术标签:

【中文标题】将文件从 Chef 客户端节点复制到工作站【英文标题】:Copy file from chef client node to workstation 【发布时间】:2013-09-16 04:58:12 【问题描述】:

我想知道如何将文件从客户端节点传输到远程机器。我检查了是否有任何资源可用于执行此操作。我找到的最接近的是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'stemplates 目录中为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】:

我找到了解决方案。感谢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

【讨论】:

以上是关于将文件从 Chef 客户端节点复制到工作站的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Chef 获取 rundeck 的节点清单

数据复制系统设计-配置新的从节点及故障切换

使用 jedis 客户端从春季开始的 aws Redis 集群

MySQL复制的多种方法

如何使用 Chef 在本地移动/复制文件

Apache httpd 反向代理方案的 SSL 问题