web-dev-qa-db-fra.com

Comment déplacer/copier des fichiers localement avec Chef

Je n'ai pas encore rencontré de ressource Chef capable de copier/déplacer des fichiers localement. Par exemple, je veux télécharger jetty hightide et le décompresser. Une fois cela fait, copiez tous les fichiers dans un dossier particulier, comme ceci:

# mv /var/tmp/jetty-hightide-7.4.5.v20110725/* /opt/jetty/

BTW, jettyhightide lorsqu'il est décompressé, vous donne un dossier et à l'intérieur de ce dossier les fichiers restants sont situés. Par conséquent, unzip jetty-hightide-7.4.5.v20110725.Zip -d /opt/jetty/ est inutile car il créera un répertoire /opt/jetty/jetty-hightide-7.4.5.v20110725/* alors que ce que je veux vraiment, c'est /opt/jetty/*. Par conséquent, je recherche une ressource locale de copie/déplacement dans Chef.

47
slayedbylucifer

Je l'ai obtenu en utilisant la ressource bash comme ci-dessous:

bash "install_jettyhightide" do
  code <<-EOL
  unzip /var/tmp/jetty-hightide-7.4.5.v20110725.Zip -d /opt/jetty/
  mv /opt/jetty/jetty-hightide-7.4.5.v20110725/* /opt/jetty/
  cp /opt/jetty/bin/jetty.sh /etc/init.d/jetty
  update-rc.d jetty defaults
  EOL
end

Mais j'espérais vraiment une façon de cuisiner. copier/déplacer des fichiers localement serait la tâche la plus générique qu'un administrateur système devra effectuer. 

13
slayedbylucifer

Comment copier un seul fichier

Première manière

J'utilise l'instruction file pour copier le fichier (vérification à la compilation)

file "/etc/init.d/someService" do
  owner 'root'
  group 'root'
  mode 0755
  content ::File.open("/home/someService").read
  action :create
end

ici :

  • "/etc/init.d/someService" - fichier cible, 
  • "/home/someService" - fichier source

Vous pouvez aussi envelopper ::File.open("/home/someService").read dans le bloc lazy

...
lazy { ::File.open("/home/someService").read }
...

Deuxième façon

Instruction remote_file de l'utilisateur (vérification au moment de l'exécution)

remote_file "Copy service file" do 
  path "/etc/init.d/someService" 
  source "file:///home/someService"
  owner 'root'
  group 'root'
  mode 0755
end

Troisième voie

Aussi, vous pouvez utiliser Shell/batch

Pour chaque répertoire

Dir[ "/some/directory/resources/**/*" ].each do |curr_path|
  file "/some/target/dir/#{Pathname.new(curr_path).basename}" do
    owner 'root'
    group 'root'
    mode 0755
    content lazy { IO.read(curr_path, mode: 'rb').read }
    action :create
  end if File.file?(curr_path)
  directory "/some/target/dir/#{File.dirname(curr_path)}" do
    path curr_path
    owner 'root'
    group 'root'
    mode 0755
    action :create
  end if File.directory?(curr_path)
end

C'est juste une idée, parce que les sous-chemins dans cet exemple ne sont pas gérés correctement.

101
CAMOBAP

Je sais que cette question a déjà été répondue et discutée, mais voici la méthode que j'utilise pour créer des fichiers.

  1. Commencez par inclure le fichier dans le dossier files/default du livre de recettes.
  2. Puis sur votre recette utilisez la ressource cookbook_file

par exemple:

cookbook_file "/server/path/to/file.ext" do
  source "filename.ext"
  owner "root"
  group "root"
  mode 00600
  action :create_if_missing
end

De la documentation du chef: http://docs.opscode.com/resource_cookbook_file.html

La ressource cookbook_file est utilisée pour transférer des fichiers d'un fichier sous-répertoire du répertoire files/ dans un livre de recettes pour un .__ spécifié. chemin situé sur l'hôte exécutant le chef-client ou le chef-solo.

13
Marcos Abreu

Vous pouvez essayer le ark cookbook. Cela extrait le fichier pour vous et vous remarquez ensuite une ressource execute.

9
StephenKing

Outre la façon dont vous l'avez fait et accepté, si vous ne voulez exécuter qu'une seule commande comme demandé au départ (copier ou déplacer) et ne pas exécuter un bloc de commandes, vous pouvez le faire avec execute Ressource:

execute "copy_core" do
    command "mv /var/tmp/jetty-hightide-7.4.5.v20110725 /opt/jetty"
    user "root"
end

Peut-être que cela aidera quelqu'un d'autre à regarder cela à l'avenir.

2
Titi

En fait, je voudrais utiliser quelque chose comme ceci (notez "binread") car cela fonctionnerait pour les fichiers texte et les fichiers binaires. utiliser "read" donnerait des résultats surprenants avec des fichiers binaires, en particulier si vous utilisez à la fois des systèmes Unix et Windows.

file destination do
  content IO.binread(source)
  action  :create
end
1
rui

Pour copier des fichiers localement dans CHEF

file "C:/Users/Administrator/chef/1.xml" 

do         --->       tar content lazy 

{

IO.read("C:/Users/Administrator/chef-repo/cookbooks/2.xml")

} -->src

action :create

end
0
user4627911

Si votre recette est déjà liée à Windows, vous pouvez utiliser des scripts PowerShell intégrés, comme ceci:

# Copy files from "C:/foo/lib" to "C:/foo"
powershell_script "copy_lib" do
  code <<-EOH
    $ErrorActionPreference = "Stop"
      Get-ChildItem -Path "C:/foo/lib" -File | Foreach-Object {
        Copy-Item -Path $_.Fullname -Destination "C:/foo" -Force
      }
  EOH
end

# Delete "C:/foo/lib" folder
powershell_script "delete_lib" do
  code <<-EOH
    $ErrorActionPreference = "Stop"
    Remove-Item -Path "C:/foo/lib" -Recurse
  EOH
end
0
JoelFan