Я пытаюсь использовать кукловод 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 agent --verbose --no-daemonize --onetime --debug | grep iptable
происходит следующее:
debug: Puppet :: Type :: Service :: ProviderRedhat: Выполнение '/ sbin / chkconfig iptables' отладка: Serviceiptables: Выполнение '/ sbin / service iptables stop' отладка: Puppet :: Type :: Service :: ProviderRedhat: Выполнение '/ sbin / chkconfig iptables 'примечание: / Stage [main] / Base :: Iptables / Service [iptables] / secure: убедитесь, что "запущен" на "остановлен" отладка: / Stage [main] / Base :: Iptables / Service [iptables ]: Класс контейнера [Base :: Iptables] будет распространять мою отладку события обновления: Serviceip6tables: Executing '/ sbin / service ip6tables status' debug: Puppet :: Type :: Service :: ProviderRedhat: Executing '/ 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. Приходите, чтобы узнать, когда марионетка была запущена, никаких вызовов для запуска службы не производилось, однако ОС по-прежнему сообщала iptables как работающую, даже если марионетка остановила ее.
Я хотел посмотреть на сам модуль iptables. Разумеется, если я удалю модуль iptables, а затем снова запустил puppet, модуль будет повторно загружен.
ОБНОВЛЕНИЕ [20140729]
Мое решение указано ниже в качестве ответа. Я открою новый вопрос, чтобы продолжить устранение неполадок CentOS 6 с этим.
Я хотел оставить это здесь как ответ на мой вопрос, потому что у меня это сработало. Если вы используете CentOS 5.4, это будет работать и эффективно обеспечит выгрузку модуля iptables из ядра. Я задам новый вопрос, касающийся моей продолжающейся работы с CentOS 6 и марионеткой.
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"
}