On Mon, Apr 25, 2011 at 08:21:21PM -0400, Michael Stevens wrote:
>Is there a preferred method for getting variables using randomint() to stop 
>getting defined once they're set, eg, avoid this;
>
> !! Redefinition of a constant scalar "rnd" (was 2786 now 195)
> !! Redefinition of a constant scalar "rnd" (was 195 now 2749)
> !! Redefinition of a constant scalar "rnd" (was 2749 now 1852)
>
>
>I'm trying to set  a randomized 0/60 minute delay on a command that runs once 
>a day so that all the machines don't fire right at the same time and overload 
>a file server the command tells them to grab a bunch of files from. If there's 
>a better way to do this than embedding an "at" or "sleep" in my command, let 
>me know ...

This isn't a direct answer to your question, but I had to do something
similar.  I wanted the clients to consistantly choose a host from a
list (it happens to be a list of two hosts, but the idea should scale).

I used something like this (untested, use at own risk, formatting
adjusted for clarity in email):

bundle agent foo {

vars:
        hostname_hash string => hash(getenv("HOSTNAME","40"),'md5');
        servername    string => execresult(
                                                                "/bin/echo 
${hostname_hash} |
                                  /bin/cut -c -16 | 
                                                                 perl -e perl 
statement could'll=qw(hostA hostB);'
                                                                          -e 
'$L=scalar @l;'
                                       -e 'print $l[hex(<>)%$L];'
                                 "useshell");
}

I actually think this a bit better than a purely random number that
changes each time.  This should give you a "random", but consistant
value for each hostname.

In your case, you just want a number 0-60, so the execresult command
could be replaced with something like:

                /bin/echo ${hostname_hash} |
                /bin/cut -c -16 |
                perl -e 'print <>%61;'"


Note that I've clipped only 16 characters, instead of the full 32 that
come from md5sum, in order to avoid integer overflows in Perl.


-- 
Jesse Becker
NHGRI Linux support (Digicon Contractor)
_______________________________________________
Help-cfengine mailing list
Help-cfengine@cfengine.org
https://cfengine.org/mailman/listinfo/help-cfengine

Reply via email to