-
-
Save peplin/470321 to your computer and use it in GitHub Desktop.
# Source accepts the protocol s3:// with the host as the bucket | |
# access_key_id and secret_access_key are just that | |
s3_file "/var/bulk/the_file.tar.gz" do | |
source "s3://your.bucket/the_file.tar.gz" | |
access_key_id your_key | |
secret_access_key your_secret | |
owner "root" | |
group "root" | |
mode 0644 | |
end |
# | |
# Author:: Christopher Peplin (<[email protected]>) | |
# Copyright:: Copyright (c) 2010 Bueda, Inc. | |
# License:: Apache License, Version 2.0 | |
# | |
# Licensed under the Apache License, Version 2.0 (the "License"); | |
# you may not use this file except in compliance with the License. | |
# You may obtain a copy of the License at | |
# | |
# http://www.apache.org/licenses/LICENSE-2.0 | |
# | |
# Unless required by applicable law or agreed to in writing, software | |
# distributed under the License is distributed on an "AS IS" BASIS, | |
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
# See the License for the specific language governing permissions and | |
# limitations under the License. | |
# | |
class Chef | |
class Provider | |
class S3File < Chef::Provider::RemoteFile | |
def action_create | |
Chef::Log.debug("Checking #{@new_resource} for changes") | |
if current_resource_matches_target_checksum? | |
Chef::Log.debug("File #{@new_resource} checksum matches target checksum (#{@new_resource.checksum}), not updating") | |
else | |
Chef::Log.debug("File #{@current_resource} checksum didn't match target checksum (#{@new_resource.checksum}), updating") | |
fetch_from_s3(@new_resource.source) do |raw_file| | |
if matches_current_checksum?(raw_file) | |
Chef::Log.debug "#{@new_resource}: Target and Source checksums are the same, taking no action" | |
else | |
backup_new_resource | |
Chef::Log.debug "copying remote file from origin #{raw_file.path} to destination #{@new_resource.path}" | |
FileUtils.cp raw_file.path, @new_resource.path | |
@new_resource.updated = true | |
end | |
end | |
end | |
enforce_ownership_and_permissions | |
@new_resource.updated | |
end | |
def fetch_from_s3(source) | |
begin | |
protocol, bucket, name = URI.split(source).compact | |
name = name[1..-1] | |
AWS::S3::Base.establish_connection!( | |
:access_key_id => @new_resource.access_key_id, | |
:secret_access_key => @new_resource.secret_access_key | |
) | |
obj = AWS::S3::S3Object.find name, bucket | |
Chef::Log.debug("Downloading #{name} from S3 bucket #{bucket}") | |
file = Tempfile.new("chef-s3-file") | |
file.write obj.value | |
Chef::Log.debug("File #{name} is #{file.size} bytes on disk") | |
begin | |
yield file | |
ensure | |
file.close | |
end | |
rescue URI::InvalidURIError | |
Chef::Log.warn("Expected an S3 URL but found #{source}") | |
nil | |
end | |
end | |
end | |
end | |
end | |
class Chef | |
class Resource | |
class S3File < Chef::Resource::RemoteFile | |
def initialize(name, run_context=nil) | |
super | |
@resource_name = :s3_file | |
end | |
def provider | |
Chef::Provider::S3File | |
end | |
def access_key_id(args=nil) | |
set_or_return( | |
:access_key_id, | |
args, | |
:kind_of => String | |
) | |
end | |
def secret_access_key(args=nil) | |
set_or_return( | |
:secret_access_key, | |
args, | |
:kind_of => String | |
) | |
end | |
end | |
end | |
end |
Can this resource copy a directory of files to a local directory as well as just a single file?
Hello. I am getting the following... any help appreciated:
19: class Chef
20: class Provider
21>> class S3File < Chef::Provider::RemoteFile
22: def action_create
23: Chef::Log.debug("Checking #{@new_resource} for changes")
24:
25: if current_resource_matches_target_checksum?
26: Chef::Log.debug("File #{@new_resource} checksum matches target checksum (#{@new_resource.checksum}), not updating")
27: else
28: Chef::Log.debug("File #{@current_resource} checksum didn't match target checksum (#{@new_resource.checksum}), updating")
29: fetch_from_s3(@new_resource.source) do |raw_file|
30: if matches_current_checksum?(raw_file)
[2016-08-25T09:50:43-04:00] ERROR: Running exception handlers
[2016-08-25T09:50:43-04:00] ERROR: Exception handlers complete
[2016-08-25T09:50:43-04:00] FATAL: Stacktrace dumped to /var/chef/cache/chef-stacktrace.out
Chef Client failed. 0 resources updated
[2016-08-25T09:50:43-04:00] ERROR: uninitialized constant #Class:0x00000003144990::Chef::Provider::RemoteFile
[2016-08-25T09:50:43-04:00] FATAL: Chef::Exceptions::ChildConvergeError: Chef run process exited unsuccessfully (exit code 1)
Hi,
this doesn't work for me when I don't pass access keys, actually the instance already has an IAM role assigned and has enough permission on bucket.
Hi,
I want how to write (or) the S3 file.
Thanks
Karthi