On Friday, June 21, 2013 1:04:36 AM UTC-5, Roman Alekseev wrote:
>
> Is the module below correct?
>
> class nginx {
>
> if defined(Package['nginx']) {
> file { "/tmp/puppet-nginx.sh":
> ensure => "present",
> owner => "root",
> group => "root",
> mode => 0755,
> source =>
> "puppet://$puppetserver/modules/nginx/puppet-nginx.sh",
> require => Package['nginx'],
> }
>
> }
Do not use defined(). Ever.
There are two possible approaches here. The better is to determine based
on node facts and/or external data whether nginx is *supposed* to be
installed, and then to include class 'nginx' only if so. In that case, the
class might look like this:
class nginx {
# ensure the package installed
package { 'nginx':
ensure => 'installed'
}
# ensure the target file in place
file { "/tmp/puppet-nginx.sh":
ensure => 'file',
owner => 'root',
group => 'root',
mode => 0755,
source => 'puppet:///modules/nginx/puppet-nginx.sh'
}
}
Note that if the file were supposed to replace one that the package
provides (e.g. a config file) then you would also want to declare a
relationship between the two to ensure that the package was managed before
the file. One way to declare that would be:
Package['nginx'] => File['/tmp/puppet-nginx.sh']
Note also that a fully-featured nginx module would probably manage the
nginx configuration file and service as well.
The alternative is what you are attempting: to detect whether nginx is
already installed, and to manage the target file only in that case. For
that, you do indeed want a custom fact to communicate to the master whether
nginx is installed. If you do it that way, then as Matthew said, the
defined() doesn't do anything useful for you. In fact, it is more likely
harmful than useful. Instead, you might write your class like this:
class nginx {
if $::nginx_is_installed == 'true' {
# ensure the target file in place
file { "/tmp/puppet-nginx.sh":
ensure => 'file',
owner => 'root',
group => 'root',
mode => 0755,
source => 'puppet:///modules/nginx/puppet-nginx.sh'
}
}
}
You can apply that to all nodes. Do note that all facts are strings. You
custom fact must be written that way, and any test you perform on the fact
value must accommodate it.
John
--
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 post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/puppet-users.
For more options, visit https://groups.google.com/groups/opt_out.