ruby - software - tutoriel chef



chef installer et mettre à jour les programmes de la source (1)

Tout d’abord, si vous avez les moyens d’héberger un référentiel de paquets interne, je vous recommande généralement de créer des packages natifs pour votre ou vos plates-formes cibles et d’utiliser la ressource package pour les gérer plutôt que de les construire à partir des sources. Je sais que ce n'est pas toujours disponible ou faisable, alors ...

La méthode par laquelle vous créez un script d’installation de style "./configure && make && make install" dépend du type de logiciel avec lequel vous travaillez. Le plus souvent, il suffit de vérifier l'existence du fichier cible. Parfois, il est souhaitable de déterminer quelle version est requise et quelle version le programme générera lorsqu'il sera exécuté avec l'option de ligne de commande appropriée. Je vais utiliser votre ressource ci-dessus comme point de départ pour ces exemples. Notez que vous pouvez utiliser bash tant que raccourci pour les ressources de script dotées d'un interpréteur bash .

Hypothèses: le programme est installé dans /usr/local/bin/program et utilise un argument --version pour afficher le numéro de version. Je mets le cd, configure et fais les commandes avec && car si l'un d'eux échoue, nous ne devrions 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 il est préférable d'utiliser la ressource remote_file , qui est idempotente en elle-même. Notez que le paramètre checksum est ajouté, avec la valeur en tant qu'attribut. Ce paramètre indique à Chef de ne pas télécharger le fichier distant si le fichier cible local correspond à la somme de contrôle. Ceci est une somme de contrôle SHA256. En outre, cette ressource notifiera au script de s'exécuter immédiatement, donc après le téléchargement. Le script est défini avec l'action :nothing donc il n'est exécuté que si le fichier 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

De plus, /tmp peut être effacé sur votre système au redémarrage. Il est recommandé de télécharger vers un autre emplacement non supprimé, tel que l'emplacement du cache de fichiers de Chef, qui correspond à 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 les recettes "sources" dans plusieurs livres de recettes partagés par Opscode ici: http://github.com/opscode/cookbooks . php livres de recettes php , python , gnu_parallel et nagios ont tous des recettes "sources".

J'ai un programme que je construis à partir des sources. Pour cela, j'utilise la ressource de script . Quel est un bon moyen d'implémenter la logique d'installation et de mise à jour? Pour le moment, je viens d'installer l'installation avec le conditionnel not_if .

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




chef