Hey Daniel,

Thanks for the reply and hints about "defined".

I ended up putting the puppetdb code into a function and calling the 
function:

$ cat modules/util/functions/does_host_have_class.pp
function util::does_host_have_class(
    String $class
) >> Boolean {
    $func_name = "util::does_host_have_class()"

    $query = [ 
        'resources[certname] {',
        'type = "Class"',
        'and',
        "title = \"${class}\"",
        'order by certname',
        '}',
    ]   
    $hosts_with_class = puppetdb_query(
        join($query, ' ')
    ).map |$entity| {
        $entity["certname"]
    }   

    "${trusted['certname']}" in $hosts_with_class
}

Cheers!

-m

On Tuesday, February 15, 2022 at 3:22:32 AM UTC-6 [email protected] 
wrote:

> Hi,
>
> no answer yet? Or did miss them? I'm not a puppet professional but i may 
> provide some other approaches and an opinion. 
>
> There is the function defined() 
> https://puppet.com/docs/puppet/7/function.html#defined , but it's tricky 
> because you need to be 100% sure that in your example class fail2ban is 
> included before the function call.
> Here is an example:
>
> ❯ cat profile/manifests/test.pp
> class profile::test (
> ) {
>   notify {"this is test.": }
> }
>
> ❯ cat profile/manifests/test2.pp
> class profile::test2 {
>   if defined(Class["profile::test"]) {
>     notify { "This ist test2. test is also here.": }
>   } else {
>     notify { "This ist test2. i'm alone. i'm cold.": }
>   }
> }
>
> ❯ cat profile/manifests/wrapper1.pp
> class profile::wrapper1 {
>   include profile::test
>   include profile::test2
> }
>
> ❯ cat profile/manifests/wrapper2.pp
> class profile::wrapper2 {
>   include profile::test2
>   include profile::test
> }
>
> Performing puppet runs with ('profile::wrapper1',)
> Info: Using configured environment 'production'
> Info: Retrieving pluginfacts
> Info: Retrieving plugin
> Info: Retrieving locales
> Info: Loading facts
> Info: Caching catalog for bullseye.local
> Info: Applying configuration version '1644913701'
> Notice: this is test.
> Notice: /Stage[main]/Profile::Test/Notify[this is test.]/message: defined 
> 'message' as 'this is test.'
> Notice: This ist test2. test is also here.
> Notice: /Stage[main]/Profile::Test2/Notify[This ist test2. test is also 
> here.]/message: defined 'message' as 'This ist test2. test is also here.'
> Notice: Applied catalog in 16.16 seconds
>
> Performing puppet runs with ('profile::wrapper2',)
> Reading package lists...
> Info: Using configured environment 'production'
> Info: Retrieving pluginfacts
> Info: Retrieving plugin
> Info: Retrieving locales
> Info: Loading facts
> Info: Caching catalog for bullseye.local
> Info: Applying configuration version '1644913738'
> Notice: This ist test2. i'm alone. i'm cold.
> Notice: /Stage[main]/Profile::Test2/Notify[This ist test2. i'm alone. i'm 
> cold.]/message: defined 'message' as 'This ist test2. i\'m alone. i\'m 
> cold.'
> Notice: this is test.
> Notice: /Stage[main]/Profile::Test/Notify[this is test.]/message: defined 
> 'message' as 'this is test.'
> Notice: Applied catalog in 15.80 seconds
>
> For me this wouldn't be reliable enough to use.
>
>
> Another approach would be to create a fact. 
> https://puppet.com/docs/puppet/7/external_facts.html
>
> ❯ cat profile/facts.d/fail2ban.sh
> #!/bin/sh
> FAIL2BAN="/usr/bin/fail2ban-client"
> [ -x ${FAIL2BAN} ] && echo fail2ban_version=$(/usr/bin/fail2ban-client 
> --version)
>
> ❯ cat profile/manifests/test3.pp
> class profile::test3 {
>   if $facts["fail2ban_version"] {
>     notify {"The fail2ban version is ${facts['fail2ban_version']}":}
>   }
> }
>
> But this solution has the same drawbacks as yours, it adds to execution 
> time and it can only be true on the second puppetrun.
>
> Imho you should find the point where you include fail2ban and do your 
> stuff there. Or you can wrap fail2ban.
>
>
> I'm sure there are puppetnerds out there with way better advice.
>
> Greetings,
> Daniel
>
>
>
> Am Fr., 11. Feb. 2022 um 22:29 Uhr schrieb 'Matt Zagrabelny' via Puppet 
> Users <[email protected]>:
>
>> Greetings,
>>
>> I have a puppetdb installation that I leverage by querying from my 
>> manifests.
>>
>> I'd like to have a boolean-like operation for puppetdb that pretty much 
>> tests if the current node has a given class as part of the catalog. Here is 
>> my current code:
>>
>>         $query = [ 
>>             'resources[certname] {',
>>             'type = "Class"',
>>             'and',
>>             "title = \"fail2ban\"",
>>             'and',
>>             "certname = \"${trusted['certname']}\"",
>>             '}',
>>         ]
>>         $this_host_has_fail2ban = puppetdb_query(
>>             $query.join(' ')
>>         ).map |$entity| {
>>             $entity["certname"]
>>         }
>>
>>         if "${trusted['certname']}" in $this_host_has_fail2ban {
>>             $shall_allow_from_internet = true
>>         }
>>         else {
>>             $shall_allow_from_internet = false
>>         }
>>
>> Is there a simpler mechanism to find out if a node has a given class in 
>> its catalog?
>>
>> Thanks for any help!
>>
>> -m
>>
>> -- 
>> You received this message because you are subscribed to the Google Groups 
>> "Puppet Users" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to [email protected].
>> To view this discussion on the web visit 
>> https://groups.google.com/d/msgid/puppet-users/bc6d5bf6-df6f-4850-ab35-59edc49e13c6n%40googlegroups.com
>>  
>> <https://groups.google.com/d/msgid/puppet-users/bc6d5bf6-df6f-4850-ab35-59edc49e13c6n%40googlegroups.com?utm_medium=email&utm_source=footer>
>> .
>>
>

-- 
You received this message because you are subscribed to the Google Groups 
"Puppet Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/puppet-users/58240572-a2cf-4286-affb-0f7b3e76d4f5n%40googlegroups.com.

Reply via email to