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のトラブルシューティングを続けるための新しい質問を開きます。
それが私のために働いたので、私は私の質問への答えとしてこれをここに残したかった。 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"
}