web-dev-qa-db-ja.com

puppetサービスがサービスを停止しない(iptables)

puppet master 3.1.1を使用して、さまざまなサーバー上のiptablesを管理しようとしています。私のローカルpuppetエージェントは2.7.19、サーバーOSは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:Executing '/ sbin/chkconfig iptables' debug:Serviceiptables:Executing '/ sbin/service iptables stop' debug:Puppet :: Type :: Service :: ProviderRedhat:Executing '/ sbin/chkconfig iptablesの通知:/ Stage [main]/Base :: Iptables/Service [iptables]/sure:「running」を「stopped」に変更したことを確認デバッグ:/ Stage [main]/Base :: Iptables/Service [iptables ]:コンテナClass [Base :: Iptables]は、更新イベントを伝播しますdebug:Serviceip6tables:Executing '/ sbin/service ip6tables status' debug:Puppet :: Type :: Service :: ProviderRedhat:Executing '/ sbin/chkconfig ip6tables'デバッグ:Class [Base :: Iptables]:コンテナStage [main]は更新イベントを伝播します

service iptables statusで手動で確認すると、サービスが実際に実行されていることがわかります。puppetはサービスを停止してから、その「更新」のために何らかの理由でサービスを開始していますか?

私はマニフェストを変更しようとしました この同様の質問に従って が、役に立たなかった、

service { "iptables":
    ensure => "stopped",
    hasstatus => "true",
    status => "true"
}

結果は同じになります。つまり、puppetをチェックしてから、iptablesを停止しますが、サービスは再びオンになります。

これが この文書化された競合状態のバグ に関連している可能性があるかどうかはわかりませんが、新しいパペットバージョンで修正されています。更新または実装するオプションがありません。現時点では、 puppetlabのファイアウォールモジュール などの適切な方法。

更新[20140724]

ここでいくつかの素晴らしいフィードバックをした後、/ etc/init.d/iptablesスクリプトからデバッグ/ロギングを行いました。 puppetが実行されているとき、サービスを開始するための呼び出しは行われていませんでしたが、人形が停止した場合でも、OSはiptablesが実行中であると報告しました。

私の傾向は、iptablesモジュール自体を見ることでした。案の定、iptablesモジュールを削除してから、puppetを再度実行すると、モジュールが再ロードされます。

更新[20140729]

私の解決策は答えとして以下にリストされています。これでCentOS6のトラブルシューティングを続けるための新しい質問を開きます。

1
Shanedroid

それが私のために働いたので、私は私の質問への答えとしてこれをここに残したかった。 CentOS 5.4を実行している場合、これは機能し、iptablesモジュールがカーネルからアンロードされることを効果的に保証します。 CentOS6と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"
      }
1
Shanedroid