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.
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.
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 sourceVous pouvez aussi envelopper ::File.open("/home/someService").read
dans le bloc lazy
...
lazy { ::File.open("/home/someService").read }
...
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
Aussi, vous pouvez utiliser Shell/batch
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.
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.
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.
Vous pouvez essayer le ark cookbook. Cela extrait le fichier pour vous et vous remarquez ensuite une ressource execute
.
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.
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
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
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