Рецепты Капистрано
вторник, 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
вроде бы хватит сегодня