如何在Capistrano中以不同的用户身份运行bash命令?

时间:2014-05-06 04:32:02

标签: capistrano capistrano3

我如何在Capistrano中完成以下操作?

sudo su - postgres
/usr/pgsql-9.2/bin/pg_ctl status -D /var/lib/pgsql/9.2/data/

以下任务无效:

task :postgres_check do
 on roles(:db) do in: :sequence |host|
  execute "sudo su - postgres << EOF
   /usr/pgsql-9.2/bin/pg_ctl status -D /var/lib/pgsql/9.2/data/ 
   EOF"  
 end
end

execute语句中的命令在bash脚本中工作。

编辑1:

我也尝试了以下内容:

task :postgres_check do
  on roles(:postgres_pref_db), in: :sequence do |host|
   execute  "/usr/pgsql-9.2/bin/pg_ctl status -D /var/lib/pgsql/9.2/data", :shell => "sudo su - postgres" 
  end
 end

哪些错误:

DEBUG [68eb95f2] Command: /usr/pgsql-9.2/bin/pg_ctl status -D /var/lib/pgsql/9.2/data
DEBUG [68eb95f2]        pg_ctl: could not open PID file "/var/lib/pgsql/9.2/data/postmaster.pid": Permission denied
cap aborted!
SSHKit::Command::Failed: /usr/pgsql-9.2/bin/pg_ctl status -D /var/lib/pgsql/9.2/data stdout: Nothing written

它似乎仍然以ssh用户身份执行命令。

1 个答案:

答案 0 :(得分:2)

我遇到了这个并为自己探索了答案。我不会接受答案,我会提供我所做的。

task :copy_files do
  on  roles(:web) do |host|
    as 'other_user' do
        execute "whoami"
    end 
  end
end

Capistrano 3使用SSH KIT,我发现这些示例对于让bash命令在我的任务中工作非常有帮助。 https://github.com/capistrano/sshkit/blob/master/EXAMPLES.md

你想要查看ssh工具包并查看关于on(),in(),with(),as()...它们可以按任何顺序嵌套使用。因此即使需要几分钟的学习,你最终也会有很多控制权。

我认为对于您的具体示例,您将希望使用as()和within()成为postgres用户并在某个目录中运行命令。

另外,我必须在我的/ etc / sudoers上为我的部署用户禁用requiretty。