35 votes

chef installe et met à jour les programmes depuis la source

J'ai un programme que je construis à partir des sources. Pour cela, j'utilise la ressource script . Quelle est la bonne façon de mettre en œuvre la logique d'installation et de mise à jour? À l'heure actuelle, je viens de mettre en œuvre l'installation avec le not_if conditionnel intégré.

 script "install_program" do
  not_if {File.exists?('/program')}
  interpreter "bash"
  user "root"
  cwd "/tmp"
  code <<-EOH
    wget http://www.example.com/program.tar.gz
    tar -zxf program.tar.gz
    cd tarball
    ./configure
    make
    make install
  EOH
end
 

68voto

jtimberman Points 5637

D'abord et avant tout, si vous avez les moyens d'accueillir un module interne de référentiel, je recommande généralement que vous générez un paquet natif pour votre plate-forme cible(s), et l'utilisation de l' package des ressources pour les gérer, plutôt que de construire à partir de la source. Je sais que c'est pas toujours disponible ou possible, alors ...

La méthode que vous faites un "./configure && make && make install" style script d'installation de la quantité dépend du type de logiciel que vous utilisez. Le plus souvent, il suffit de cocher pour le fichier cible de l'existence. Parfois, il est souhaitable de déterminer quelle version, et la version du programme de sortie lorsqu'elle est exécutée avec la bonne option de ligne de commande. Je vais utiliser vos ressources ci-dessus comme point de départ pour ces exemples. Notez que vous pouvez utiliser bash comme un raccourci pour script des ressources qui ont interprète bash.

Hypothèses: Le programme est installé à l' /usr/local/bin/program et prend un argument --version , probablement pour afficher le numéro de version. J'ai mis le cd, de configurer et de faire des commandes en collaboration avec && , car on peut supposer que si l'un tombe en panne, nous ne devons pas tenter de continuer l'exécution.

bash "install_program" do
  not_if "/usr/local/bin/program --version | grep -q '#{node[:program][:version]}'"
  user "root"
  cwd "/tmp"
  code <<-EOH
    wget http://www.example.com/program-#{node[:program][:version]}.tar.gz -O /tmp/program-#{node[:program][:version]}.tar.gz
    tar -zxf program-#{node[:program][:version]}.tar.gz
    (cd program-#{node[:program][:version]}/ && ./configure && make && make install)
  EOH
end

Au lieu d'utiliser wget c'est un peu mieux utiliser l' remote_file des ressources comme c'est idempotent sur son propre. Notez que l' checksum paramètre est ajoutée, avec la valeur d'un attribut. Ce paramètre indique le Chef de ne pas télécharger le fichier distant si la cible local de fichier correspond à la somme de contrôle. C'est une somme de contrôle SHA256. Aussi, cette ressource en informera le script à exécuter immédiatement, donc après qu'il est téléchargé. Le script est configuré avec l'action de l' :nothing de sorte qu'il sera exécuté si le remote_file est téléchargé.

remote_file "/tmp/program-#{node[:program][:version]}.tar.gz" do
  source "http://www.example.com/program-#{node[:program][:version]}.tar.gz"
  checksum node[:program][:checksum]
  notifies :run, "bash[install_program]", :immediately
end

bash "install_program" do
  user "root"
  cwd "/tmp"
  code <<-EOH
    tar -zxf program-#{node[:program][:version]}.tar.gz
    (cd program-#{node[:program][:version]}/ && ./configure && make && make install)
  EOH
  action :nothing
end

Aussi, /tmp peuvent être effacés sur votre système lors du redémarrage. Il est recommandé que vous téléchargez à un autre endroit qui n'est pas supprimé, comme le Chef de file de l'emplacement du cache, qui est la valeur de Chef::Config[:file_cache_path]. Par exemple:

remote_file "#{Chef::Config[:file_cache_path]}/program.tar.gz" do
  ...
end

Pour d'autres exemples, vous pouvez voir "source" recettes dans les livres de recettes partagées par les Opscode ici: http://github.com/opscode/cookbooks. php, python, gnu_parallel, et nagios livres de cuisine ont tous "source" des recettes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X