Как перемещать/копировать файлы локально с шеф-поваром
Я еще не сталкивался с ресурсом Chef, который будет скопировать/перемещать файлы локально. Например, я хочу загрузить причал hightide и разархивировать его. После этого скопируйте все файлы в определенную папку, например:
# mv /var/tmp/jetty-hightide-7.4.5.v20110725/* /opt/jetty/
BTW, jettyhightide при распаковке, дает вам папку и внутри этой папки находятся остальные файлы. Следовательно, unzip jetty-hightide-7.4.5.v20110725.zip -d /opt/jetty/
бесполезен, потому что он создаст каталог /opt/jetty/jetty-hightide-7.4.5.v20110725/*
, тогда как я действительно хочу /opt/jetty/*
. Поэтому я ищу локальный ресурс копирования/перемещения в Chef.
Ответы
Ответ 1
Я работал, используя ресурс bash
, как показано ниже:
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
Но я действительно надеялся, что это будет шеф-повар. копирование/перемещение файлов локально было бы самой общей задачей, которую должен выполнить sysadmin.
Ответ 2
Как скопировать один файл
Первый способ
Я использую оператор file
для копирования файла (проверка времени компиляции)
file "/etc/init.d/someService" do
owner 'root'
group 'root'
mode 0755
content ::File.open("/home/someService").read
action :create
end
здесь:
-
"/etc/init.d/someService"
- целевой файл,
-
"/home/someService"
- исходный файл
Также вы можете обернуть ::File.open("/home/someService").read
в lazy
block
...
lazy { ::File.open("/home/someService").read }
...
Второй способ
Пользователь remote_file
(проверка времени выполнения)
remote_file "Copy service file" do
path "/etc/init.d/someService"
source "file:///home/someService"
owner 'root'
group 'root'
mode 0755
end
Третий путь
Также вы можете использовать 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
Это просто идея, потому что подпункты в этом примере обрабатываются неправильно.
Ответ 3
Я знаю, что этот вопрос уже был дан ответ и обсужден, но вот метод, который я использую при создании файлов.
- Сначала включите файл под файлами cookbook/папкой по умолчанию
- Затем в вашем рецепте используйте ресурс
cookbook_file
например:
cookbook_file "/server/path/to/file.ext" do
source "filename.ext"
owner "root"
group "root"
mode 00600
action :create_if_missing
end
От документации шеф-повара: http://docs.opscode.com/resource_cookbook_file.html
Ресурс cookbook_file используется для передачи файлов с подкаталог файла/каталога в поваренной книге с указанным путь, который расположен на хосте, где работает шеф-повар или шеф-повар.
Ответ 4
Вы можете попробовать ark поваренную книгу. Это извлекает файл для вас, и вы после этого замечаете ресурс execute
.
Ответ 5
Помимо того, как вы это сделали и приняли, если вы только хотели запустить одну команду, как вы первоначально спросили (скопируйте или переместите), а не запустите блок команд, вы можете сделать это с помощью execute ресурс:
execute "copy_core" do
command "mv /var/tmp/jetty-hightide-7.4.5.v20110725 /opt/jetty"
user "root"
end
Возможно, это поможет кому-то еще взглянуть на это в будущем.
Ответ 6
Я бы использовал что-то вроде следующего (обратите внимание на "binread" ), поскольку это будет работать для текстовых файлов и двоичных файлов. использование "чтения" даст удивительные результаты с бинарными файлами, особенно если вы используете обе системы unix и windows.
file destination do
content IO.binread(source)
action :create
end
Ответ 7
Скопировать файлы локально в 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
Ответ 8
Если ваш рецепт уже привязан к Windows, вы можете использовать встроенные сценарии PowerShell, например:
# 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