[chef] RE: RE: Is a Chef Resource that returns a boolean value?


Chronological Thread 
  • From: Adam Edwards < >
  • To: "David A. Williams" < >,
  • Subject: [chef] RE: RE: Is a Chef Resource that returns a boolean value?
  • Date: Fri, 7 Feb 2014 06:11:43 -0800

Thanks David, that helps. Please add your vote and other comments to the
RFC pull request as encouragement to us to add this functionality to Chef:
https://github.com/opscode/chef-rfc/pull/5/files

If you're willing to write some Ruby, I'd suggest implementing your own
resource in a cookbook that inherits from
Chef::Resource::PowershellScript:

1.  Then you can override not_if and only_if such that if a string is
provided, it executes powershell.exe (you can even create a new instance
of Chef::Resource::PowershellScript to do this).
2.  You should change the code before you pass it to powershell -- add in
the "exit ! [int32](yourcodehere)" trick.
3. You can make this fairly special case, i.e. it's your resource, so you
don't have to make it support all the things that a normal resource
supports -- that means the code tricks in #2 can be fairly simple (you
could ignore cases such as the expression not being Boolean or use very
simple type interpolation for exceptions).

You can see a lot of the tricks for doing this on display in the prototype
branch I referred to earlier -- look at the
Chef::Provider::PowershellScript and Chef::Resource::PowershellScript
resources:

https://github.com/opscode/chef/tree/adamed-chef-4553-dsl-interpolated-sta
tus

-Adam


-----Original Message-----
From: David A. Williams 
[mailto:
Sent: Friday, February 7, 2014 4:33 AM
To: 
;
 

Subject: Re: [chef] RE: Is a Chef Resource that returns a boolean value?

Adam,

Yes, that would be helpful! Below is an example of one I'm using to see if
a user already has the logon on as a service permission which is similar.

powershell_script "Add Log On As A Service Right to #{params[:user]}" do
    code <<-EOH
      #{Dir.tmpdir()}/LogOnAsAService.ps1 -user #{params[:user]}
-addPermission
    EOH
    only_if{`powershell.exe -ExecutionPolicy RemoteSigned
#{Dir.tmpdir()}/LogOnAsAService.ps1 -user
#{params[:user]}`.downcase.include?('has permission = false')}
  end

I'm also messing around with calling helper methods in a module to
abstract the code a little bit.  This is proving tricky.  I've learned
that only class module methods work within resources but class module
methods don't have access to Chef resources.  This part of ruby is new to
me but good learning experience.

Thank you,
David Williams

From: Adam Edwards 
< <mailto: >>
Reply-To: 
" <mailto: >"
< <mailto: >>
Date: Friday, February 7, 2014 2:10 AM
To: 
" <mailto: >"
< <mailto: >>,
" <mailto: >"
< <mailto: >>
Subject: [chef] RE: Is a Chef Resource that returns a boolean value?

Correction: actually, in the example below, the workaround must be
inverted, so a "!" needs to be added:

    powershell -command "exit [int32](!(get-executionpolicy) -eq
'remotesigned'))"

-Adam

From: Adam Edwards 
[mailto: <mailto: >]
Sent: Thursday, February 6, 2014 10:57 PM
To: 
' <mailto: >'
Subject: RE: [chef] Is a Chef Resource that returns a boolean value?


David, I have a branch in progress that adds this feature to
powershell_script (if I understand you correctly). See the doc at
https://github.com/opscode/chef-rfc/blob/adamed/resource-guard/rfc0001-res
ource-guard.md -- it has a link to a branch.



Is this the behavior you'd like to see?



    # What if guards evaluated powershell script code that powershell

    # evaluates as a boolean type as the actual boolean value of the guard

    # itself? You can avoid extra script code to translate the boolean
into

    # a process exit code that results in the right true / false behavior

    # for the guard

    powershell_script "set execution policy" do

      code "set-executionpolicy remotesigned"

      not_if "(get-executionpolicy) -eq 'remotesigned'" # Like I barely
left Ruby -- wow!

    end



The current workaround for the example above is to use an expression like

  powershell -command "exit [int32](get-executionpolicy) -eq
'remotesigned')"



in the not_if above. It basically forces the script to convert a Boolean
data type to an integer that is then returned as the process exit code,
which is interpreted by Chef as a Boolean value.



-Adam



-----Original Message-----
From: David A. Williams 
[mailto:
Sent: Thursday, February 6, 2014 7:36 PM
To: Chef users
Subject: [chef] Is a Chef Resource that returns a boolean value?



I work with Chef on Windows node and find myself writing a lot of Chef
guards for the powershell_script resource.  I was wondering if there was a
Chef resource that returned a boolean value that I could use here.

Thank you,

David Williams



________________________________

CONFIDENTIALITY NOTICE: This electronic mail may contain information that
is privileged, confidential, and/or otherwise protected from disclosure to
anyone other than its intended recipient(s). Any dissemination or use of
this electronic mail or its contents by persons other than the intended
recipient(s) is strictly prohibited. If you have received this
communication in error, please notify the sender immediately by reply
e-mail so that we may correct our internal records. Please then delete the
original message. Thank you.

________________________________
CONFIDENTIALITY NOTICE: This electronic mail may contain information that
is privileged, confidential, and/or otherwise protected from disclosure to
anyone other than its intended recipient(s). Any dissemination or use of
this electronic mail or its contents by persons other than the intended
recipient(s) is strictly prohibited. If you have received this
communication in error, please notify the sender immediately by reply
e-mail so that we may correct our internal records. Please then delete the
original message. Thank you.



Archive powered by MHonArc 2.6.16.

§