Рецепты Капистрано

Вторник, 11 марта, 2008

проблема:
не получается выполнять команды на удаленном хосте

no such file or directory: /usr/bin/env (php, mysql, etc.)

решение: установка $PATH


default_environment["PATH"] = '/opt/csw/php5/bin:/opt/csw/mysql5/bin:/opt/csw/bin:/usr/sbin:/usr/local/bin:$PATH'

проблема: аяяй, чекаут кода (таски setup, update_code, rollback_code, and symlink) пытается выполняться во всех ролях!! (на мейл сервере, на MySQL сервере и т.д. )

решение: прописываем у таких ролей :no_release => true


role :mail, config_production[:mail][:host], :no_release => true
role :solr, config_production[:solr][:host], :no_release => true
role :db, config_production[:db][:host], :no_release => true

проблема: не можем выполнить удаленную команду, т.к. не можем даже влогиниться (начиная от версии Capistrano 2.1)

** [err] Permission denied, please try again.
** [err] Permission denied, please try again.
** [err] Permission denied (publickey,gssapi-with-mic,password).
svn: Connection closed unexpectedly

решение: Начиная с версии 2.1, капистрано больше не запрашивает pty в каждой команде. Проблема в том, что на некоторых системах (на Соляре точно, проверено) некоторые команды (svn, passwd) автоматически впадают в неинтерактивный режим.


# по умолчанию оно false
default_run_options[:pty] = true

проблема: я хочу получить данные коннекта к базе от пхпшного приложения в руби, и юзать для сетапа чего-нибудь, и пусть мне дадут готовый хеш
решение: (для Symfony)
php кусок


// гдето тут берется DSN
// mysql://root:pwd@localhost/mydb
$data =  preg_split('(://|@|/|:)', $link);
list($conf_arr[':dbtype'], $conf_arr[':user'], $conf_arr[':pass'], $conf_arr[':host'], $conf_arr[':dbname']) = $data;
echo base64_encode(sfYaml::dump($conf_arr));

руби кусок (получаем настоящий юзабельный тру-хеш с символами в кач. ключей)


  # Get DB conf
  desc "Get DB connection hash"
  task :db_get_conf, :roles => :web do
    enc = ""
    run "cd #{app} && php deploy-db-sendconf.php" do |channel, stream, data|
      enc = data
      raise data if stream == :err
    end
    # base64decode & convert to hash from YAML
    YAML.load enc.unpack("m")[0]
  end

авторизация (ручками)


  # restart apache webserver
  desc "Restart the web server"
  task :restart, :roles => :web do
    sudo "svcadm restart svc:/network/http:cswapache2" do |ch, stream, out|
      ch.send_data "#{sudo_password}\n" if out =~ /^Password:/
      raise out if stream == :err
    end
  end

вроде бы хватит сегодня