Подтвердить что ты не робот

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

Я еще не сталкивался с ресурсом 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.

4b9b3361

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