mujer - funciones del chef
Cómo mover/copiar archivos localmente con Chef (8)
Todavía no he encontrado un recurso de Chef que copie / mueva archivos localmente. Por ejemplo, quiero descargar Jetty Hightide y descomprimirlo. Una vez hecho esto, copie todos los archivos en una carpeta particular, como esto:
# mv /var/tmp/jetty-hightide-7.4.5.v20110725/* /opt/jetty/
BTW, jettyhightide cuando está descomprimido, te da una carpeta y dentro de esa carpeta se encuentran el resto de los archivos. Por lo tanto, unzip jetty-hightide-7.4.5.v20110725.zip -d /opt/jetty/
es inútil porque creará un directorio /opt/jetty/jetty-hightide-7.4.5.v20110725/*
mientras que lo que realmente quiero es /opt/jetty/*
. Por lo tanto, estoy buscando un recurso local de copiar / mover en Chef.
Cómo copiar un solo archivo
Primera forma
Yo uso file
declaración del file
para copiar el archivo (verificación en tiempo de compilación)
file "/etc/init.d/someService" do
owner ''root''
group ''root''
mode 0755
content ::File.open("/home/someService").read
action :create
end
aquí :
-
"/etc/init.d/someService"
- archivo de destino, -
"/home/someService"
- archivo fuente
También puede envolver ::File.open("/home/someService").read
en bloque lazy
...
lazy { ::File.open("/home/someService").read }
...
Segunda vía
Declaración del remote_file
usuario (verificación en tiempo de ejecución)
remote_file "Copy service file" do
path "/etc/init.d/someService"
source "file:///home/someService"
owner ''root''
group ''root''
mode 0755
end
Tercera vía
También puedes usar shell / batch.
Para cada directorio
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
Esto es solo una idea, porque las subrutas en este ejemplo no se manejan correctamente.
Además de la forma en que lo has hecho y aceptado, si solo quisieras ejecutar un comando como pediste inicialmente (copiar o mover), y no ejecutar un bloque de comandos, entonces podrías hacerlo con el recurso de execute :
execute "copy_core" do
command "mv /var/tmp/jetty-hightide-7.4.5.v20110725 /opt/jetty"
user "root"
end
Tal vez esto ayude a alguien más a ver esto en el futuro.
Lo tengo funcionando usando el recurso bash
la siguiente manera:
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
Pero realmente esperaba una forma de chef para hacerlo. Copiar / mover archivos localmente sería la tarea más genérica que un administrador de sistemas deberá realizar.
Podrías darle una oportunidad al libro de cocina ark . Esto extrae el archivo para usted y luego observa un recurso de execute
.
Realmente usaría algo como lo siguiente (aviso "binread") ya que esto funcionaría para archivos de texto y archivos binarios. el uso de "lectura" arrojaría resultados sorprendentes con los archivos binarios, especialmente si utiliza sistemas Windows y Unix.
file destination do
content IO.binread(source)
action :create
end
Sé que esta pregunta ya ha sido respondida y discutida, pero aquí está el método que utilizo al crear archivos.
- Primero incluya el archivo en la carpeta de archivos / recetas del libro de recetas
- Luego, en su receta, use el recurso
cookbook_file
.
p.ej:
cookbook_file "/server/path/to/file.ext" do
source "filename.ext"
owner "root"
group "root"
mode 00600
action :create_if_missing
end
De la documentación del chef: http://docs.opscode.com/resource_cookbook_file.html
El recurso cookbook_file se utiliza para transferir archivos desde un subdirectorio de los archivos / directorio en un libro de cocina a una ruta específica que se encuentra en el host que ejecuta el cliente-chef o chef-solo.
Si su receta ya está vinculada a Windows, puede usar scripts incrustados de PowerShell, como este:
# 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
Para copiar archivos localmente en 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