Ниже прилагается марионеточный модуль, который я написал, который передает конфигурацию 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
отношения вызывают это.