Capistrano,sudo命令和多个密码

问题描述:

我使用capistrano来运行命令。我有基于ssh-key的认证,但每台机器上都有不同的sudo密码。Capistrano,sudo命令和多个密码

我capfile看起来像这样

default_run_options[:pty] = true 
role :admin, "server1","server2","server3" 

desc "myCommand" 
task :mycommand, :roles=>:admin do 
    run "cd <workdir> && #{sudo} <command>" 
end 

当我运行此我得到下面的输出:

* executing `myCommand' 
    * executing "cd <workdir> && sudo -p 'sudo password: ' <command>" 
    servers: ["server1", "server2", "server3"] 
    [server2] executing command 
    [server3] executing command 
Password: 
** [out :: server2] 
** [out :: server3] 
    [server1] executing command 
** [out :: server1] 
** [out :: server3] CMD-OUTPUT 
*** [out :: server2] Sorry, try again. 
** [out :: server2] Sorry, try again. 
Password: 
** [out :: server2] 
** [out :: server1] 
** [out :: server2] CMD-OUTPUT 
** [out :: server1] 
** [out :: server1] Sorry, try again. 
** [out :: server1] sudo: 3 incorrect password attempts 
    command finished in 14411ms 
failed: "sh -c 'cd <workdir> && sudo -p '\\''sudo password: '\\'' <command>'" on server1 

显然Capistrano的假设我有同样的passwort每个服务器上,这可能吗?我该如何解决这个问题?

+0

请参阅此问题的答案:http://stackoverflow.com/questions/8241639/multiple-server-deploy-asking-ssh-password-for-each-server – 2012-04-16 16:17:50

+0

我已经有公钥登录设置,但我需要sudo。我能以某种方式“不平行”运行吗? – 2012-04-16 17:17:20

对于这样的自动安装,最常见的方法是使用没有设置密码的SSH密钥。只有私钥的所有权足以允许登录(因此文件本身实际上是密码)。

您可以通过限制SSH配置中可以连接的密钥的IP地址以及允许其运行的命令来进一步保护系统,以防万一文件丢失。

+0

我使用capistrano用于管理目的,不用于部署。所以我需要sudo。就像我说的,我已经设置了公钥登录。 – 2012-04-16 17:17:01

Capistrano不支持具有不同密码的多个服务器。而不是将它们全部更改为不推荐的相同密码,您可以设置您需要通过sudo运行的某些命令,而不需要相关用户的密码。

为了让用户bob sudo准入猫没有密码,你将添加到您的sudoers文件:

bob ALL=NOPASSWD: /bin/cat 

显然有一些安全问题在这里,但我觉得他们是小于给你盖用户全面sudo访问您的所有箱子。请务必阅读“man sudoers”并仔细限制使用NOPASSWD允许的命令。

+0

这不是一个好的选择。有没有办法做到串行而不是并行的命令? – 2012-04-17 12:15:37