【问题标题】:run capistrano 3 custom setup scripts as root once以 root 身份运行 capistrano 3 自定义设置脚本一次
【发布时间】:2014-05-12 07:10:50
【问题描述】:

我已经让 capistrano 3 以非 root 用户身份无密码部署完美运行。

我现在要做的是设置一个安装脚本来安装新贵服务、sudoers.d 文件并在服务器上安装一些依赖项。

这样我就可以通过在 production.rb 文件中输入用户和主机并运行 cap production setupserver 来安装新服务器

问题是我创建的设置脚本需要以 root 身份运行。

但由于它是一次性的,我只想向用户询问 root 密码并在服务器上运行几个任务。

as :root 命令不起作用,因为它使用了su -c

我可以要求输入密码,如此处所示 http://capistranorb.com/documentation/faq/how-can-i-get-capistrano-to-prompt-for-a-password/

关于如何覆盖 production.rb 文件中指定的用户的任何建议?

以及如何传递询问的密码?

【问题讨论】:

    标签: capistrano capistrano3


    【解决方案1】:

    我最终解决的方法是为同一服务器添加另一个角色。

    role :app, 'theappuser@myserver'
    role :install, 'root@myserver', :no_release => true
    

    然后做这样的事情

    desc 'Install nginx'
    task :install do
      on roles(:install) do
        require 'erb'
        template = ERB.new(File.new('deploy/templates/nginx.conf.erb').read).result(binding)
        upload! StringIO.new(template), "/etc/nginx/conf.d/#{fetch(:domain)}.conf"
      end
    
      on roles(:app) do
        invoke 'nginx:restart'
      end
    end
    

    【讨论】:

    • FWIW,在全局 nginx.conf 文件的 server {} 块中,您可以添加通配符以包含多个特定于应用程序的配置。您可以使用include /var/www/apps/*/current/config/nginx.conf; 之类的东西来拉入不需要以root 身份安装的特定于应用程序的nginx 配置,并且可以将其放置在每个应用程序的rails config/ 目录中。那么在第一次部署之后,您需要以 root 身份运行的唯一操作是 sudo service nginx restart
    【解决方案2】:

    如果我理解正确,这应该可以通过设置用户变量来解决您的问题:

    set :current_user, Proc.new { current_user = Capistrano::CLI.ui.ask "Enter deploy user" }

    if current_user.present?
       set :user, "#{current_user}"
    end
    

    它会在为用户运行命令之前询问您的操作,然后将此用户分配给 production.rb :user,然后您将能够在设置中控制它。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-29
    • 2023-03-16
    • 2014-05-21
    • 1970-01-01
    • 2016-06-19
    • 2011-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多