Как перемещать/копировать файлы локально с помощью Chef

Я еще не сталкивался с ресурсом Chef, который будет копировать/перемещать файлы локально. Например, я хочу скачать jetty 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.


person slayedbylucifer    schedule 07.10.2013    source источник
comment
не могли бы вы помочь мне в следующем вопросе? stackoverflow.com/questions/39105976/mv-resource- шеф-повар/   -  person Raja    schedule 24.08.2016
comment
вы говорите скопировать все файлы, но затем вы показываете команду mv, которая перемещает не копии   -  person JoelFan    schedule 07.12.2017


Ответы (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

Это просто идея, потому что подпути в этом примере обрабатываются неправильно.

person CAMOBAP    schedule 31.10.2013
comment
Спасибо за исчерпывающий ответ. Я бы хотел, чтобы ресурс file имел атрибут content_file или что-то в этом роде. Это кажется довольно распространенным явлением. - person Matt Kantor; 14.11.2013
comment
Отличный ответ! Мне особенно нравится «Первый способ» выше, поскольку, если содержимое файла не изменено, он не обновит файл. Стоит отметить, что если исходный файл управляется Chef, то ::File.open должен быть заключен в ленивый блок, иначе Chef не сможет найти файл во время компиляции. Атрибут lazy доступен только в Chef ›= 11.6, ›= 10.28 (кажется). - person Jon-Erik; 14.03.2014
comment
Стоит отметить, что использование удаленного файла обойдет Chef, требующий, чтобы файл существовал во время компиляции. - person SamG; 18.07.2014
comment
Пожалуйста, добавьте примечание, что разница между remote_file и file также заключается в том, что file выполняется во время компиляции, а remote_file выполняется во время выполнения. Поэтому, когда вам нужно работать с файлами во время выполнения - remote_fileхороший обходной путь. - person Cherry; 20.12.2014
comment
Обязательно обратите внимание, что для двоичных файлов вам нужно будет изменить его на IO.read(curr_path, mode: 'rb'), иначе вы рискуете повредить конечный файл. - person TheLonelyGhost; 01.04.2017
comment
remote_file помог мне, позволив автоматически отслеживать дельты файлов. Спасибо! - person hmacias; 11.04.2019

Я заработал, используя ресурс 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

Но я очень надеялся, что это сделает шеф-повар. локальное копирование/перемещение файлов будет наиболее общей задачей, которую должен будет выполнить системный администратор.

person slayedbylucifer    schedule 07.10.2013
comment
Способ работы «шеф-повар» будет больше похож на пример «Для каждого каталога» в примере @CAMOBAP — создавать ресурс для каждого каталога и каждого файла. Это на самом деле ужасно для производительности. То, что вы сделали, на самом деле правильно, и это тот вариант использования, для которого предназначен ресурс bash. Вы можете добавить not_if или creates для проверки создания файла /etc/init.d/jetty/jetty.sh, чтобы сделать его более идемпотентным. - person lamont; 01.09.2014
comment
ПРИМЕЧАНИЕ: теперь в шеф-клиенте есть ресурс archive_file, который лучше, чем большинство из них. подходы «свернуть свой собственный исполняемый ресурс» - person lamont; 21.08.2020

Я знаю, что на этот вопрос уже был дан ответ и он обсуждался, но вот метод, который я использую при создании файлов.

  1. Сначала включите файл в папку файлов/по умолчанию поваренной книги.
  2. Затем в своем рецепте используйте ресурс cookbook_file

e.g:

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

Из документации шеф-повара: https://docs.chef.io/resources/cookbook_file/

Ресурс cookbook_file используется для передачи файлов из подкаталога каталога files/ в поваренной книге по указанному пути, расположенному на хосте, на котором запущен шеф-клиент или шеф-повар-соло.

person Marcos Abreu    schedule 17.02.2014
comment
Этот пост посвящен перемещению файлов, уже находящихся на целевой машине, в другое место на целевой машине. cookbook_file не может этого сделать. cookbook_file используется для копирования файлов из поваренной книги на целевую машину, а не локально вокруг целевой машины. - person Martin; 27.11.2014
comment
Я делаю некоторые действия с использованием модуля copy в Ansible, спасибо. - person Chu-Siang Lai; 04.10.2016

Вы можете попробовать кулинарную книгу ark. Это извлечет файл для вас, и вы впоследствии заметите ресурс execute.

person StephenKing    schedule 07.10.2013
comment
+1 Я очень рекомендую эту кулинарную книгу. Упрощает работу с архивными файлами. Также поддерживает исходные установки. - person Mark O'Connor; 09.10.2013
comment
Да, я знал об Арке. но было бы излишним использовать его только для копирования/перемещения. Мое основное намерение - копировать / перемещать файлы, а не устанавливать их в архив .tar / .zip. Мне действительно интересно, почему opscode не подумал о создании простого способа копирования/перемещения файлов. - person slayedbylucifer; 09.10.2013
comment
Да я как-то согласен. Но они не могут запустить продукт с поддержкой всего. Ark также подходит для простой распаковки, даже без танца ./configure && make && make install. - person StephenKing; 09.10.2013
comment
Теперь в шеф-клиент встроен ресурс archive_file. - person lamont; 21.08.2020

Помимо того, как вы это сделали и приняли, если вы хотите запустить только одну команду, как вы изначально просили (копировать или переместить), а не запускать блок команд, вы можете сделать это с помощью выполнить ресурс:

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

Возможно, это поможет кому-то еще, глядя на это в будущем.

person Titi    schedule 23.07.2015
comment
Предупреждение здесь: это будет запускать mv снова и снова при каждом запуске шеф-повара, если защита не добавлена, если файл в цели был изменен, любое изменение будет потеряно. - person Tensibai; 14.09.2015
comment
@Tensibai, он только что спросил, как выполнить команду «mv» в Chef. Все зависит от того, куда вы поставите этот блок. Вы всегда можете добавить not_if { File.exist?("/opt/jetty") } в блок, чтобы он не повторял его, если он уже был скопирован. - person Titi; 14.09.2015
comment
Предупреждение для будущих читателей этого вопроса/ответов. (И решение задачи XY не всегда лучшее решение) - person Tensibai; 14.09.2015

На самом деле я бы использовал что-то вроде следующего (обратите внимание на «binread»), так как это будет работать для текстовых и двоичных файлов. использование «чтения» даст удивительные результаты с двоичными файлами, особенно если вы используете системы Unix и Windows.

file destination do
  content IO.binread(source)
  action  :create
end
person rui    schedule 20.10.2016
comment
На самом деле это очень важно, работа с такими вещами, как файлы хранилища ключей Java, будет прервана, если вы используете метод чтения по умолчанию. - person Serban Cezar; 22.05.2020

Локальное копирование файлов в 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
person Community    schedule 21.07.2015
comment
Нерабочий код, а идея уже есть в предыдущем ответе выше) - person Tensibai; 23.07.2015

Если ваш рецепт уже привязан к 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
person JoelFan    schedule 08.12.2017