This visudo checker I've written (based on some examples from the web
and puppet training materials) causes a dependency loop -- but only
when I include the unless => "diff ...".  It seems someone got clever
and decided to look at exec's and look for managed filenames in
argument lists and create implicit dependencies from them?  Argh!

I also tried just making the exec a refreshonly from the sudoers_check
file's notify, but then the sudoers file itself ignored the bad return
from the exec even though it requires => the exec.

My best solution so far is to just let the visudo run every time...

$ puppet --version
2.6.4

define sudo::fragment($source, $order=10) {
    concat::fragment { "${name}_sudoers":
        source => $source,
        target => $sudo::config::sudoers,
    }
    concat::fragment { "${name}_sudoers_check":
        source => $source,
        target => $sudo::config::sudoers_check,
    }
}

class sudo::config($sudoers="/etc/sudoers") {
    $sudoers_check = "${sudoers}.check"
}

class sudo {
    include concat::setup
    $sudoers = $sudo::config::sudoers
    $sudoers_check = $sudo::config::sudoers_check
    package { "sudo":
        ensure => installed,
    }
    concat { $sudoers_check:
        owner   => root,
        group   => root,
        mode    => 440,
        warn    => true,
    }
    exec { "visudo -cf $sudoers_check":
        path        => "/usr/sbin/:/usr/bin",
        require     => [Concat[$sudoers_check], Package["sudo"]],
        unless      => "diff $sudoers $sudoers_check",
    }
    concat { $sudoers:
        owner   => root,
        group   => root,
        mode    => 440,
        require => [Exec["visudo -cf $sudoers_check"], File[$sudoers_check]],
        warn    => true,
    }
}

class { "sudo::config": sudoers => "/tmp/sudoers" }

sudo::fragment { "ob":
        source       => "puppet:///modules/sudo/sudoers",
        #source       => "/etc/passwd",
 }

err: Could not apply complete catalog: Found dependency cycles in the
following relationships: Exec[visudo -cf /tmp/sudoers.check] =>
File[/var/lib/puppet/concat/_tmp_sudoers],
File[/var/lib/puppet/concat/_tmp_sudoers] =>
File[/var/lib/puppet/concat/_tmp_sudoers/fragments], Exec[visudo -cf
/tmp/sudoers.check] =>
File[/var/lib/puppet/concat/_tmp_sudoers/fragments], Exec[visudo -cf
/tmp/sudoers.check] => File[/tmp/sudoers], Exec[concat_/tmp/sudoers]
=> File[/tmp/sudoers], File[/tmp/sudoers] => Exec[visudo -cf
/tmp/sudoers.check],
File[/var/lib/puppet/concat/_tmp_sudoers/fragments] =>
File[/var/lib/puppet/concat/_tmp_sudoers/fragments/10_ob_sudoers],
File[/var/lib/puppet/concat/_tmp_sudoers] =>
Exec[concat_/tmp/sudoers], File[/var/lib/puppet/concat/_tmp_sudoers]
=> Exec[concat_/tmp/sudoers],
File[/var/lib/puppet/concat/_tmp_sudoers/fragments] =>
Exec[concat_/tmp/sudoers],
File[/var/lib/puppet/concat/_tmp_sudoers/fragments] =>
Exec[concat_/tmp/sudoers], Exec[visudo -cf /tmp/sudoers.check] =>
Exec[concat_/tmp/sudoers],
File[/var/lib/puppet/concat/_tmp_sudoers/fragments/10_ob_sudoers] =>
Exec[concat_/tmp/sudoers],
File[/var/lib/puppet/concat/_tmp_sudoers/fragments.concat.out] =>
Exec[concat_/tmp/sudoers],
File[/var/lib/puppet/concat/_tmp_sudoers/fragments.concat] =>
Exec[concat_/tmp/sudoers], File[/var/lib/puppet/concat/_tmp_sudoers]
=> File[/var/lib/puppet/concat/_tmp_sudoers/fragments.concat.out],
Exec[visudo -cf /tmp/sudoers.check] =>
File[/var/lib/puppet/concat/_tmp_sudoers/fragments.concat.out],
File[/var/lib/puppet/concat/_tmp_sudoers] =>
File[/var/lib/puppet/concat/_tmp_sudoers/fragments.concat],
Exec[visudo -cf /tmp/sudoers.check] =>
File[/var/lib/puppet/concat/_tmp_sudoers/fragments.concat]; try using
the '--graph' option and open the '.dot' files in OmniGraffle or
GraphViz

-- 
You received this message because you are subscribed to the Google Groups 
"Puppet Users" group.
To post to this group, send email to puppet-users@googlegroups.com.
To unsubscribe from this group, send email to 
puppet-users+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/puppet-users?hl=en.

Reply via email to