Назад | Перейти на главную страницу

Почему вызов exec моего класса Puppet срабатывает, даже если триггер подписки не соответствует?

Ниже прилагается марионеточный модуль, который я написал, который передает конфигурацию iptables нашим балансировщикам нагрузки. Это работает, за исключением того, что сценарий so-bans-apply запускается при каждом запуске марионетки, независимо от того, было ли обновление у самих Сервисов. У меня вопрос: почему exec запускается при каждом запуске и как я могу заставить его запускаться только при обновлении подписанной службы?

Я попытался удалить оператор «onlyif» в Exec, думая, что, возможно, onlyif вызовет безусловное выполнение, но даже без «onlyif» exec все равно запускает каждый запуск марионетки.

Определение узла указано так же, без каких-либо аргументов:


node /or-rtlb\d{2}/ {
     include iptables
}

А вот код самого класса:



class iptables ($ApplyBans=true)
{
    if $hostname =~ /(?i:or-rtlb\d{2})/ {
        $ip6tables_file="or-rtlbs.ip6tables"
        $iptables_file="or-rtlbs.iptables"
    }
    if $hostname =~ /(?i:or-puptest)/ {
        $ip6tables_file="or-rtlbs.ip6tables"
        $iptables_file="or-rtlbs.iptables"
    }


    case $::osfamily {
        RedHat:
        {
            file { "/etc/sysconfig":
                ensure => directory,
                owner => root,
                group => root,
                mode  => 0755
            }

            file { "ip6tables-file":
                path    => "/etc/sysconfig/ip6tables",
                ensure  => present,
                owner   => root,
                group   => root,
                mode    => 0644,
                source  => "puppet:///modules/iptables/$ip6tables_file",
                require => [File["/etc/sysconfig"], Package["iptables"]],
                notify  => Service["ip6tables-service"]
            }
            file { "iptables-file":
                path    => "/etc/sysconfig/iptables",
                ensure  => present,
                owner   => root,
                group   => root,
                mode    => 0644,
                source  => "puppet:///modules/iptables/$iptables_file",
                require => [File["/etc/sysconfig"], Package["iptables"]],
                notify  => Service["iptables-service"]
            }
            package { "iptables":
                ensure => installed
            }
            package { "iptables-ipv6":
                ensure => installed
            }
            service { "iptables-service":
                name        => "iptables",
                ensure          => running,
                hasstatus       => true,
                hasrestart      => true,
                enable          => true,
            }
            service { "ip6tables-service":
                name        => "ip6tables",
                ensure          => running,
                hasstatus       => true,
                hasrestart      => true,
                enable          => true,
            }

            if ($ApplyBans)
            {
                exec { "so-bans-apply" :
                    command => "/root/bans/so-bans/force-ban-refresh",
                    onlyif => "/usr/bin/test -f /root/bans/so-bans/force-ban-refresh",
                    subscribe => [
                        Service["iptables-service"],
                        Service["ip6tables-service"],
                    ]                   
                }
            }
        }
    }
}

Добавить refreshonly => true к exec, и он будет работать только тогда, когда notify или subscribe отношения вызывают это.