2010-11-10 2 views
0

J'ai un fichier Capfile pour les déploiements en plusieurs étapes qui doit déployer le code sur un serveur (NFS) et redémarrer plusieurs serveurs d'applications. Les rôles ne peuvent donc pas être utilisés facilement car les serveurs d'applications n'ont pas besoin d'être utilisés pour le déploiement: update_code. J'ai trouvé quelque chose qui pourrait fonctionner, mais j'ai un problème qui doit être résolu.Problème avec: hôtes

application_servers = nil 

task :production do 
    role :nfs, "nfs.someserver.net" 
    application_servers = "app.someserver.net" 
end 

task :staging do 
    role :nfs, "nfs-staging.someserver.net" 
    application_servers = "app-staging.someserver.net" 
end 

desc "tail resin logs #{resin_logs}" 
task :tail, :hosts => application_servers do 
    puts("Server is:"#{application_servers}) 
    stream "tail -f #{resin_logs}" 
end 

Et lors de l'exécution:

#$ cap staging tail 
    * executing `staging' 
    * executing `tail' 
    Server is:app-staging.someserver.net 
    * executing "tail -f /log/resin/*.log" 
    servers: ["nfs-staging.someserver.net"] 
    [nfs-staging.someserver.net] executing command 
tail: cannot open `/log/resin/*.log' for reading: No such file or directory 
tail: no files remaining 
    command finished 
failed: "sh -c 'tail -f /log/resin/*.log'" on nfs-staging.someserver.net 

Lorsque la valeur d'impression de application_servers dans la queue de la tâche, il est dit "app-staging.someserver.net", mais la valeur utilisée dans: hosts => application_servers est vide (c'est pourquoi il utilise le rôle nfs à la place).

Pourquoi la variable application_server a-t-elle deux valeurs différentes? Est-ce un problème de portée? J'ai essayé avec global ($) et cela ne fonctionne pas aussi bien.

Répondre

0

Résolu le problème en passant de l'utilisation de: hosts à: rôles sur une tâche spécifique à l'application et ajouté un nouveau rôle. La fonctionnalité clé consiste à utiliser no_release afin que le code ne soit pas déployé sur les serveurs d'applications. Nous voulons seulement redémarrer l'instance de résine sur ces machines.

task :production do 
    role :nfs, "nfs.someserver.net" 
    role :application, "app.someserver.net", :no_release => true; 
end 

task :staging do 
    role :nfs, "nfs-staging.someserver.net" 
    role :application, "app-staging.someserver.net", :no_release => true; 
end 

desc "tail resin logs #{resin_logs}" 
task :tail, :roles => application_servers do 
    puts("Server is:"#{application_servers}) 
    stream "tail -f #{resin_logs}" 
end 
Questions connexes