Как перемещать / копировать файлы локально с помощью Chef
Я еще не сталкивался с ресурсом Chef, который будет копировать / перемещать файлы локально. Например, я хочу скачать hightide причал и распаковать его. После этого скопируйте все файлы в определенную папку, например:
# mv /var/tmp/jetty-hightide-7.4.5.v20110725/* /opt/jetty/
кстати, jettyhightide при распаковке дает вам папку, и внутри этой папки находятся остальные файлы. Отсюда unzip jetty-hightide-7.4.5.v20110725.zip -d /opt/jetty/
бесполезно, потому что он создаст каталог /opt/jetty/jetty-hightide-7.4.5.v20110725/*
тогда как то, что я действительно хочу, это /opt/jetty/*
. Поэтому я смотрю для локального копирования / перемещения ресурса в Chef.
8 ответов
Как скопировать один файл
Первый способ
я использую 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
блок
...
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
это просто идея, потому что под-пути в этом примере обрабатываются неправильно.
Я заставил его работать с помощью 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
но я действительно надеялся на шеф-повар способ сделать это. копирование / перемещение файлов локально будет самой общей задачей, которую должен будет выполнить системный администратор.
Я знаю, этот вопрос уже ответили и обсудили, но вот метод, который я использую при создании файлов.
- сначала включите файл под файлами поваренной книги / папка по умолчанию
- тогда по вашему рецепту используйте
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 используется для передача файлов из подкаталог файлы/ каталог в поваренной книге для указанного путь, который находится на хосте под управлением chef-client или chef-solo.
вы могли бы дать ковчег рецепты попробовать. Это извлекает файл для вас, и вы впоследствии замечаете execute
ресурсов.
кроме того, как вы это сделали и приняли его, если вы только хотели запустить одну команду, как вы изначально просили (копировать или перемещать), а не запускать блок команд, то вы могли бы сделать это с помощью выполнить источник:
execute "copy_core" do
command "mv /var/tmp/jetty-hightide-7.4.5.v20110725 /opt/jetty"
user "root"
end
возможно, это поможет кому-то еще посмотреть на это в будущем.
Я бы использовал что-то вроде следующего (обратите внимание на "binread"), поскольку это будет работать для текстовых файлов и двоичных файлов. использование "read" даст удивительные результаты с двоичными файлами, особенно если вы используете системы unix и windows.
file destination do
content IO.binread(source)
action :create
end
копировать файлы локально в 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
если ваш рецепт уже привязан к 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