[chef] Re: Re: Place file only once per version


Chronological Thread 
  • From: Russ Lavoie < >
  • To: " " < >
  • Subject: [chef] Re: Re: Place file only once per version
  • Date: Fri, 16 Aug 2013 04:50:58 -0700 (PDT)
  • Domainkey-signature: a=rsa-sha1; q=dns; c=nofws; s=s1024; d=yahoo.com; h=X-YMail-OSG:Received:X-Rocket-MIMEInfo:X-Mailer:References:Message-ID:Date:From:Reply-To:Subject:To:In-Reply-To:MIME-Version:Content-Type; b=TAQhbpCZdLCIGpZaBpNUMKcmbV7om7Em4BKqci5CghSbTgLizYNw2c3w1rbziJ6Jo78S7ILMgB+T0RiKruxiothEo/VTD/LDgHjUtW6fpe0iXY86NhW3qvlMgq+legvMe8lBNvDzE76sTd1+FhVDmW9y+yBmPJGD7U8J6yEEJGo=;

An option is to have chef lay down a versioned file and symlink the versioned file to a name the application is expecting.

default['file_version'] = 1.2
template "file-#{node[file_version]}.txt" do
  source "file"
  ...
  ...
end

link "/path/to/source/file-#{node[file_version]}.txt" do
  to "/path/to/expected/by/app/file
end

Then you can unlink the previous version in a similar way.

Hope that helps a bit.


From: " " < >
To:
Sent: Thursday, August 15, 2013 3:19 PM
Subject: [chef] Re: Place file only once per version

Hi Mike,

I only need the file to be placed once per version a process outside chef moves this file to a working location and removes it when done. But if the file was to be created again it would trigger the same process again.
This is why I need only place it once per unique checksum. It's not a big deal to change the outside process just time consuming. I think its an option to only create the file once per checksum on the chef side too.

Hope that makes sense.


I guess I'm not understanding what a "unique version" of a file is.

If I modify file 'foo', and put it in my cookbook, then the checksum will differ from the in-place file on the target node, and be placed on disk with `action :create`.

If I then modify the file on disk, then I've changed the checksum locally, and Chef will clobber my change.

You may want to adopt a flow where you on-server modifications (which is an interesting use-case, please elaborate) are done to a copy of your Chef-goverend file.

-M


On Thu, Aug 15, 2013 at 1:42 PM, Damien Roche < " target="_blank" href="mailto: "> > wrote:
The file only needs to be placed once per unique version of the file and is moved modified outside chef control.
On 15 Aug 2013 18:39, "Mike" < " target="_blank" href="mailto: "> > wrote:
Even better:

cookbook_file "foo" do
  action :create_if_missing
end

Boom.
-M

On Thu, Aug 15, 2013 at 1:23 PM, Andrew Gross < " target="_blank" href="mailto: "> > wrote:
Whats wrong with

cookbook_file "foo" do
  action :create
  not_if { ::File.exists?("foo") }
end


On Thu, Aug 15, 2013 at 12:44 PM, Ranjib Dey < " target="_blank" href="mailto: "> > wrote:


On Thu, Aug 15, 2013 at 9:43 AM, Ranjib Dey < " target="_blank" href="mailto: "> > wrote:
well, you can do that using ruby stdlib, as well as low level chef api (that chef uses to make file/template/cookbookfile/remote_file [1] idempotent). But why you want to do it? If you are doing it
inside a recipe, probably its a bad idea, consider pushing them inside providers or libraries



On Thu, Aug 15, 2013 at 9:24 AM, < " target="_blank" href="mailto: "> > wrote:
Is it possible to get a checksum of a cookbook file and store this in the attribute?

require 'Digest'
cb_filename = ? 

if node.attribute['staged_checksum'] == Digest::SHA2.file(File.new(cb_filename))
	Chef::Log.info("Already been staged")
else
	Chef::Log.info("Update staging")
	node.attribute['staged_checksum'] = Digest::SHA2.file(File.new(cb_filename))
end



inside a recipe

if node.attribute?('bar')
  Chef::Log.info('already run')
else
  ruby_block 'set_attribute' do
    block do
      nod.set['foo']='bar'
    end
  end
   file '/foo/bar' do
     content "foobar"
   end
end


On Thu, Aug 15, 2013 at 3:20 AM, < " target="_blank" href="mailto: "> > wrote:
Hello,

Would would be the best way to only place a file once per cookbook version. It's modified and removed outside chef.

Regards
D.














Archive powered by MHonArc 2.6.16.

§