我如何在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
用户身份执行命令。
答案 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。