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

служба марионеток не останавливает службу (iptables)

Я пытаюсь использовать кукловод 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"
      }