puppet class if

3,514 views
Skip to first unread message

Jakub Bittner

unread,
Oct 11, 2013, 5:48:35 AM10/11/13
to puppet...@googlegroups.com
Hello,

I created puppet class and I want the file operation to be executed on all servers but not on server with hostname "'server1.domain.com". I tried this class, but it does not work. Is there any other way? Thanks


class test {
    if $hostname != 'server1.domain.com' {
                file { "/etc/ntp.conf":
                        owner   => root,
                        group   => root,
                        mode    => 644,
                        source  => "puppet:///files/server/ntp.conf",
                }
    }
}

Peter Bukowinski

unread,
Oct 11, 2013, 8:39:30 AM10/11/13
to puppet...@googlegroups.com
You have a couple errors in your if statement. For comparing a literal string, you need to use double-equals in your test:

if $hostname == 'server1.domain.com' { ... }

For a regex match, you'd use the equal-tilde:

if $hostname =~ /^server/ { ... }

To negate a match, you put the not (!) in front of the entire comparison, e.g.

if ! $hostname == 'server1.domain.com' { ... }

I like to add parentheses around my comparisons for visual clarity:

if ( $hostname =~ /^server/ ) and ! ( $virtual == 'vmware' ) { ... }

--
Peter Bukowinski

Werner Flamme

unread,
Oct 11, 2013, 9:06:10 AM10/11/13
to puppet...@googlegroups.com
Peter Bukowinski [11.10.2013 14:39]:
I do not see "a couple of errors". But I'm a novice, so you can enlarge
my knowledge easily ;-)

You show only one error by mentioning that the if statement may not have
an inequality sign: "To negate a match, you put the not (!) in front of
the entire comparison". Where can I find this in the puppet language
description?

First, I looked at
<http://docs.puppetlabs.com/puppet/3/reference/lang_conditional.html#if-statements>.
Under the caption "Conditions" I find - among others - "Expressions". So
I follow that link, and on the linked page under
<http://docs.puppetlabs.com/puppet/3/reference/lang_expressions.html#non-equality>
I find the != operator. I do not find any hint that one has to prepend
the nagation to the whole statement. In the contrary, in the "Syntax"
section I see a sample for a comparison with an inequality sign:
"($operatingsystem != 'Solaris')".

Where do I find that != is not allowed in this case?

BTW, I'd never write a class like that, I'd rather use different node
declarations... ;-)

Regards,
Werner

--

Peter Bukowinski

unread,
Oct 11, 2013, 9:57:12 AM10/11/13
to puppet...@googlegroups.com
I've been using the convention where the not (!) is separate from the equals sign and it works well for me, so I suspect your only error was using a single equal sign rather than a the required double.

--
Peter

Werner Flamme

unread,
Oct 11, 2013, 9:59:10 AM10/11/13
to puppet...@googlegroups.com
Peter Bukowinski [11.10.2013 15:57]:
I'm not Jakub (the OP), it is not my problem.

I'm only the one who wanted to know where the "couple of errors" are.

Regards,
Werner

--
Werner Flamme, Abt. WKDV
Helmholtz-Zentrum f�r Umweltforschung GmbH - UFZ
Helmholtz Centre for Environmental Research - UFZ
Permoserstr. 15 - 04318 Leipzig / Germany
Tel./phone: +49 341 235-1921 - Fax +49 341 235-451921
Information nach �� 37a HGB, 35a GmbHG:
Sitz der Gesellschaft: Leipzig
Registergericht: Amtsgericht Leipzig, Handelsregister Nr. B 4703
Vorsitzender des Aufsichtsrats: MinDirig Wilfried Kraus
Wissenschaftlicher Gesch�ftsf�hrer: Prof. Dr. Georg Teutsch
(Scientific Managing Director)
Administrative Gesch�ftsf�hrerin: Dr. Heike Gra�mann
(Administrative Managing Director)

Bernd Weber

unread,
Oct 11, 2013, 10:30:11 AM10/11/13
to puppet...@googlegroups.com, werner...@ufz.de
Guys,

check this out:

Either way should work.

@Jakub, 2 things I see here:
* you should generally make sure to use the right scope in your variables. I'm assuming from your code that you want the global facter variable hostname in which case you should use in in a global scope: $::hostname.
* Hostname normally only gives you the first part of the fully qualified name in your case that would be 'server1'. if you need the fully qualified name for a server with the domain you usually need to use: $::fqdn

Also you can easily check situations like this with a notice(http://docs.puppetlabs.com/references/latest/function.html#notice) or notify(http://docs.puppetlabs.com/references/latest/type.html#notify) statement

Hope this helps!

-Bernd
Helmholtz-Zentrum f�r Umweltforschung GmbH - UFZ
Helmholtz Centre for Environmental Research - UFZ
Permoserstr. 15 - 04318 Leipzig / Germany
Tel./phone: +49 341 235-1921 - Fax +49 341 235-451921
Information nach �� 37a HGB, 35a GmbHG:
Sitz der Gesellschaft: Leipzig
Registergericht: Amtsgericht Leipzig, Handelsregister Nr. B 4703
Vorsitzender des Aufsichtsrats: MinDirig Wilfried Kraus
Wissenschaftlicher Gesch�ftsf�hrer: Prof. Dr. Georg Teutsch
(Scientific Managing Director)
Administrative Gesch�ftsf�hrerin: Dr. Heike Gra�mann
(Administrative Managing Director)

jcbollinger

unread,
Oct 14, 2013, 10:47:55 AM10/14/13
to puppet...@googlegroups.com


On Friday, October 11, 2013 8:59:10 AM UTC-5, Werner Flamme wrote:
I'm not Jakub (the OP), it is not my problem.

I'm only the one who wanted to know where the "couple of errors" are.



Peter was mistaken.  There are no actual errors in the OP's manifest, and it might work in some environments.  In particular, the operator "!=" performs a boolean test for non-equality, just as the OP expected it to do.  The reason it didn't work for him is almost surely what Bernd pointed out: the $::hostname fact usually contains only a local name, not a fully-qualified domain name.


John

Reply all
Reply to author
Forward
0 new messages