7

我在让我的 Chef 食谱克隆一个私人仓库时遇到了很多麻烦。好吧,我昨天让它工作了,但是在“cheffin”了我的 Vagrant 盒子六次之后,我把它弄坏了。我是厨师新手,你可能猜到了。

按照此处的 deploy_resource 指南,我创建了 deploy.rb 配方(缩短):

deploy_branch "/var/www/html/ps" do
  repo              git@github.com:simonmorley/private-v2.git
  ssh_wrapper       "/tmp/.ssh/chef_ssh_deploy_wrapper.sh"
  branch            "rails4"
  migrate           false
  environment       "RAILS_ENV" => node[:ps][:rails_env] 
  purge_before_symlink %w{conf data log tmp public/system public/assets}
  create_dirs_before_symlink []
  symlinks(                        # the arrow is sort of reversed:
    "conf"   => "conf",            # current/conf          -> shared/conf
    "data"   => "data",            # current/data          -> shared/data
    "log"    => "log",             # current/log           -> shared/log
    "tmp"    => "tmp",             # current/tmp           -> shared/tmp
    "system" => "public/system",   # current/public/system -> shared/system
    "assets" => "public/assets"    # current/public/assets -> shared/assets
  )
  scm_provider Chef::Provider::Git # is the default, for svn: Chef::Provider::Subversion
  notifies :restart, "service[ps]"
  notifies :restart, "service[nginx]"
end

默认情况下,我有以下内容来创建目录等。

directory "/tmp/.ssh" do
  action :create
  owner node[:base][:username]
  group node[:base][:username]
  recursive true
end

template "/tmp/.ssh/chef_ssh_deploy_wrapper.sh" do
  source "chef_ssh_deploy_wrapper.sh.erb"
  owner node[:base][:username]
  mode 0770
end

# Put SSH private key to be used with SSH wrapper
template "/tmp/.ssh/id_deploy" do
  source "id_rsa.pub.erb"
  owner node[:base][:username]
  mode 0600
end

在包装器中:

#!/bin/sh
exec ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -i "/tmp/.ssh/id_deploy" "$@"

我创建了一个公钥并将其上传到 github。

当我部署配方时,它给了我一个错误:

 deploy_branch[/var/www/html/ps] action deployEnter passphrase for key '/tmp/.ssh/id_deploy': 

观察我没有设置密码...因此必须丢失私钥..

偶然地,我从配方中删除了 id_deploy 键,删除了文件夹并再次运行它。低,看,它开始工作......原因是 id_rsa.pub && id_rsa 文件在我手动生成它们以进行测试时位于 /root/.ssh 中。

我不明白我在这里做错了什么。因此,我的问题是:

  • 我需要部署到的每个节点上的私钥和公钥吗?文档没有提到这一点。
  • 这不应该部署为非 root 用户吗?我在角色文件中设置了一个用户..
  • 为什么 ssh_wrapper 没有做它应该做的事情
4

2 回答 2

18

花了好几天的时间才能正确解决这个问题。

只是为了澄清一下,这就是我为解决它所做的。我不知道它是否正确,但它对我有用。

  • 按照本教程生成一组公钥和私钥

  • 将公钥添加到要克隆的 Github 存储库中。

  • 在我的默认配方中创建一个包含公钥和私钥的模板。见下文。

  • 为 pub 和 private 密钥创建了相关模板。

  • 创建了 chef_ssh_deploy_wrapper.sh.erb 文件(见下文)

  • 创建了一个 deploy.rb 配方(见下文)

  • 上传食谱并将其添加到我的角色中。冉厨师客户。

  • 嘿,快!坐下来喝杯啤酒,看看你的回购。巧妙地克隆到您的目录中。

模板如下:

创建目录和模板:

template "/tmp/.ssh/chef_ssh_deploy_wrapper.sh" do
  source "chef_ssh_deploy_wrapper.sh.erb"
  owner node[:base][:username]
  mode 0770
end

template "/home/#{node[:base][:username]}/.ssh/id_rsa.pub" do
  source "id_rsa.pub.erb"
  owner node[:base][:username]
  mode 0600
end

template "/home/#{node[:base][:username]}/.ssh/id_rsa" do
  source "id_rsa.erb"
  owner node[:base][:username]
  mode 0600
end

创建一个 ssh 包装器chef_ssh_deploy_wrapper.erb

#!/bin/sh
exec ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -i "/home/#{node[:base][:username]}/.ssh/id_rsa" "$@"

(请确保您在此处使用私钥,否则会失败)

最后是 deploy.rb 配方:

deploy_branch node[:my_app][:deploy_to] do
  repo              node[:base][:repository]
  ssh_wrapper       "/tmp/.ssh/chef_ssh_deploy_wrapper.sh"
  branch            "rails4"
  user               node[:base][:username]
  group              node[:base][:username]
  rollback_on_error  true
  migrate            false
  environment        "RAILS_ENV" => node[:my_app][:environment] 
  purge_before_symlink %w{conf data log tmp public/system public/assets}
  create_dirs_before_symlink []
  symlinks(                        
    "config"   => "config",        
    "data"   => "data",            
    "log"    => "log",             
    "tmp"    => "tmp",             
    "system" => "public/system",  
    "assets" => "public/assets"  
  )
  scm_provider Chef::Provider::Git # is the default, for svn: Chef::Provider::Subversion
  before_restart do
    system("su #{node[:base][:username]} -c 'cd #{node[:my_app][:deploy_to]}/current && /usr/bin/bundle install'") or raise "bundle install failed"
    system("su #{node[:base][:username]} -c 'RAILS_ENV=production /usr/local/bin/rake assets:precompile'")
  end
  notifies :restart, "service[my_app]"
  notifies :restart, "service[nginx]"
end

由于我们最初是从源代码编译 ruby​​,但最终决定使用 rvm,因此之前的重新启动已被替换。多用户安装更容易。

注意:我以 sudo 用户身份进行部署,如果您以 root 身份进行部署(避免这种情况),请改用 /root/.ssh 路径。

我从这篇文章中得到了很多启发。

祝你好运,我希望这对某人有所帮助。

于 2013-08-28T18:17:33.793 回答
1

您的问题没有指向deploy_resource源的链接,所以我不确定这是否适用,但如果它使用git下面的资源,以下内容可能会有所帮助......

this answer to a similar question中所述,您可以通过将 SSH 命令添加为存储库 URL 的“外部传输”部分来避免创建额外的脚本文件来使用每个 SSH 密钥:

git "/path/to/destination" do
  repository "ext::ssh -i /path/to/.ssh/deployment_key -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no git@github.com %S /my_name/some_repo.git"
  branch "master"
  ...
end
于 2015-11-19T17:19:11.487 回答