Estou tentando usar um mestre de marionetes 3.1.1 para gerenciar o iptables em vários servidores. Meu local
agente fantoche é 2.7.19 , o sistema operacional do servidor é CentOS 5.4 .
/etc/puppet/modules/mycompany/manifests/config/iptables.pp
class base::iptables (
{
{
$identity_environment = $::identity_environment
}
if ($identity_environment == "production")
{
$start_iptables = "true"
$run_iptables = "running"
}
elsif ($identity_environment == "development")
{
$start_iptables = "false"
$run_iptables = "stopped"
}
if ($run_iptables != "stopped")
{
file { "/etc/sysconfig/iptables":
ensure => file,
owner => root,
group => root,
mode => 644,
source => "puppet://path_to_my_conf",
require => File["/etc/resolv.conf"],
}
service { "iptables":
subscribe => File["/etc/sysconfig/iptables"],
enable => "$start_iptables",
ensure => "$run_iptables",
status => "[[ 'iptables -L -n | egrep -v '(Chain|target)' | grep '^[A-Za-z]' | wc -l' != 0 ]]",
}
}
else
{
service { "iptables":
enable =>"$start_iptables",
ensure =>"$run_iptables",
}
}
}
Quando eu executo o fantoche em um servidor de desenvolvimento:
puppet agent --verbose --no-daemonize --onetime --debug | grep iptable
ocorre o seguinte:
debug: Puppet::Type::Service::ProviderRedhat: Executing
'/sbin/chkconfig iptables' debug: Serviceiptables:
Executing '/sbin/service iptables stop' debug:
Puppet::Type::Service::ProviderRedhat: Executing '/sbin/chkconfig
iptables' notice:
/Stage[main]/Base::Iptables/Service[iptables]/ensure: ensure changed
'running' to 'stopped' debug:
/Stage[main]/Base::Iptables/Service[iptables]: The container
Class[Base::Iptables] will propagate my refresh event debug:
Serviceip6tables: Executing '/sbin/service
ip6tables status' debug: Puppet::Type::Service::ProviderRedhat:
Executing '/sbin/chkconfig ip6tables' debug: Class[Base::Iptables]:
The container Stage[main] will propagate my refresh event
Verificar manualmente com service iptables status
mostra que o serviço está de fato em execução. O fantoche está parando o serviço e, de alguma forma, iniciando-o devido a essa 'atualização'?
Eu tentei alterar meu manifesto de acordo com essa pergunta semelhante , mas sem sucesso ,
service { "iptables":
ensure => "stopped",
hasstatus => "true",
status => "true"
}
resulta na mesma coisa - checagem de bonecos, depois parando o iptables, mas ainda assim o serviço é ativado novamente.
Eu não sei se isso pode estar relacionado a esse bug documentado de condição de corrida que foi corrigido em um fantoche novo versão, eu não tenho a opção de atualizar ou implementar um método adequado, como módulo de firewall do puppetlab neste momento.
UPDATE [20140724]
Depois de um ótimo feedback aqui, fiz algumas depurações / logs do script /etc/init.d/iptables. Venha descobrir Quando o boneco estava funcionando, nenhuma chamada para iniciar o serviço estava sendo feita, no entanto, o sistema operacional ainda relatava que o iptables estava funcionando mesmo se o fantoche parasse.
Minha inclinação era olhar para o próprio módulo iptables. Com certeza, se eu removesse o módulo iptables e depois executasse o fantoche novamente, o módulo seria recarregado.
UPDATE [20140729]
Minha solução está listada abaixo como uma resposta. Vou abrir uma nova pergunta para continuar a solucionar problemas com o CentOS 6.