Кукольный сервис не останавливая сервис (iptables)
Я пытаюсь использовать Puppet Master 3.1.1 для управления iptables на различных серверах. Мой локальныйагент - 2.7.19, ОС сервера - 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",
}
}
}
Когда я запускаю puppet на сервере разработки:
puppet agent --verbose --no-daemonize --onetime --debug | grep iptable
происходит следующее:
debug: Puppet:: Type:: Service:: ProviderRedhat: Выполнение '/sbin/chkconfig iptables' debug: Serviceiptables: Выполнение '/sbin/service iptables stop' debug: Puppet::Type::Service::ProviderRedhat: Выполнение '/ sbin / chkconfig iptables 'извещение: /Stage[main]/Base::Iptables/Service[iptables]/ обеспечить: убедиться, что отладка "работает" на "остановлен" отладка: /Stage[main]/Base::Iptables/Service[iptables]: Контейнерный класс [Base::Iptables] будет распространять мое событие обновления debug: Serviceip6tables: выполнение '/sbin/service ip6tables status' debug: Puppet::Type::Service::ProviderRedhat: выполнение '/sbin/chkconfig ip6tables' debug: Class[Base::Iptables]: контейнер Stage [main] будет распространять мое событие обновления
Проверка вручную с service iptables status
показывает, что служба действительно работает, останавливает ли ее марионетка, а затем каким-то образом запускает ее из-за этого "обновления"?
Я попытался изменить свой манифест в соответствии с этим похожим вопросом, но безрезультатно,
service { "iptables":
ensure => "stopped",
hasstatus => "true",
status => "true"
}
приводит к тому же самому - проверка марионеток, затем остановка iptables, но служба снова включается.
Я не знаю, может ли это быть связано с этой задокументированной ошибкой состояния гонки, которая была исправлена в более новой версии кукол, у меня нет возможности обновить или реализовать соответствующий метод, такой как модуль брандмауэра puppetlab в настоящее время.
ОБНОВЛЕНИЕ [20140724]
После некоторого отличного отзыва я выполнил некоторую отладку / ведение журнала из скрипта /etc/init.d/iptables. Приходите, чтобы узнать, когда puppet работал, не было никаких вызовов для запуска службы, однако операционная система по-прежнему сообщала, что iptables работает, даже если puppet остановил ее.
Я хотел посмотреть на сам модуль iptables. Конечно, если я уберу модуль iptables, а затем снова запускаю puppet, модуль будет перезагружен.
ОБНОВЛЕНИЕ [20140729]
Мое решение указано ниже в качестве ответа. Я открою новый вопрос для продолжения устранения неполадок CentOS 6 с этим.
1 ответ
Я хотел оставить это здесь как ответ на мой вопрос, потому что он работал для меня. Если вы используете CentOS 5.4, это будет работать и эффективно обеспечит выгрузку модуля iptables из ядра. Я задам новый вопрос, конкретно касающийся моей дальнейшей работы с CentOS 6 и Puppet.
exec { "chkconfig_iptables":
onlyif => "/sbin/chkconfig --level 3 iptables",
command => "/sbin/chkconfig --level 3 iptables off",
before => exec["kill_iptables"]
}
exec { "kill_iptables":
onlyif => "/sbin/lsmod | grep ip_tables",
command => "/sbin/service iptables stop;/sbin/modprobe -f -r ip_tables"
}