Chef deploy_resource repository privado, ssh deploy keys y ssh_wrapper

Estoy teniendo muchos problemas para conseguir que mi receta de Chef clone un repo privado. Bueno, lo tuve funcionando ayer, pero después de ‘cheffin’ mi caja de Vagrant media docena de veces, la rompí. Soy un chef novato, como puedes imaginar.

Siguiendo la guía deploy_resource aquí, he creado mi receta deploy.rb (abreviada):

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 

De forma predeterminada, tengo lo siguiente para crear los dirs, etc.

 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 

Y en la envoltura:

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

Y he creado una clave pública y la he cargado en github.

Cuando despliegue la receta, me da un error:

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

Obvs No tengo una contraseña establecida … Por lo tanto, debe faltar la clave privada …

Solo por casualidad, eliminé la clave id_deploy de la receta, borré las carpetas y la ejecuté nuevamente. Bajo y he aquí, comenzó a funcionar … La razón es que los archivos id_rsa.pub && id_rsa estaban en /root/.ssh cuando los generé manualmente para probar.

No entiendo lo que estoy haciendo mal aquí. Mis preguntas son por lo tanto:

  • ¿Necesito una clave privada y pública en cada nodo que despliegue? Los doctores no mencionan esto.
  • ¿No debería esto implementarse como usuario no root? He establecido un usuario en mi archivo de roles …
  • ¿Por qué el ssh_wrapper no hace lo que se supone que debe hacer?

Tomó un buen par de días para resolver esto correctamente.

Solo para aclarar, esto es lo que hice para arreglarlo. No sé si es correcto, pero funciona para mí.

  • Genere un conjunto de claves públicas y privadas siguiendo este tutorial .

  • Agregue la clave pública al repository de Github que desea clonar.

  • Crear una plantilla en mi receta predeterminada que incluya tanto las claves públicas como las privadas. Vea abajo.

  • Creé las plantillas relevantes para el pub y las claves privadas.

  • Creé el archivo chef_ssh_deploy_wrapper.sh.erb (ver más abajo)

  • Creó una receta deploy.rb (ver más abajo)

  • Subí y añadí las recetas a mi rol. Corrió chef-cliente.

  • ¡Listo! Siéntate con una cerveza y mira tu repo. Inteligentemente clonado en su dir.

Las plantillas son las siguientes:

Crea los directorios y plantillas:

 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 

Cree un envoltorio 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" "$@" 

(Asegúrate de usar la clave privada aquí o fallará)

Finalmente la receta 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 

El reinicio anterior ha sido reemplazado ya que inicialmente comstackmos ruby ​​desde la fuente pero decidimos usar rvm al final. Mucho más fácil para instalaciones multiusuario.

NB: estoy implementando como usuario sudo, si lo está haciendo como root (evite esto), use la ruta /root/.ssh en su lugar.

Me inspiré mucho en este artículo .

Buena suerte, espero que esto ayude a alguien.

Su pregunta no tiene un enlace a la fuente deploy_resource , por lo que no puedo estar seguro de si esto se aplicará, pero si utiliza un recurso de git debajo, lo siguiente podría ser útil …

Como se describe en esta respuesta a una pregunta similar , puede evitar crear archivos de script adicionales para cada clave SSH agregando el comando SSH como parte de “transporte externo” de la URL del repository:

 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