Vagrant で作った VM 上で service iptables start できない問題

  • 2
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

症状

iptables の設定をするような chef のレシピを書いて Vagrant で作った VM 上で実行したら、次のようなエラーが出た。iptables サービスを起動できていないようだ。

  ================================================================================
    Error executing action `start` on resource 'service[iptables]'
    ================================================================================

    Mixlib::ShellOut::ShellCommandFailed
    ------------------------------------
    Expected process to exit with [0], but received '6'
    ---- Begin output of /sbin/service iptables start ----
    STDOUT: 
    STDERR: 
    ---- End output of /sbin/service iptables start ----
    Ran /sbin/service iptables start returned 6

試しに手動で $ sudo service iptables start してみると、なんのメッセージも表示されない。

原因

/etc/sysconfig/iptables が存在しないと /etc/init.d/iptables がエラーを吐くから。


# Do not start if there is no config file.
[ ! -f "$IPTABLES_DATA" ] && return 6

参考: http://serverfault.com/questions/405791/service-iptables-doesnt-display-message

Box ファイルにもよるのかもしれませんが、僕の手元の VM にはデフォルトで iptables ファイルが存在しませんでした。

解決策

not_if で条件を付けつつ templete リソースから notifies する。

service "iptables" do
  supports :status => true, :restart => true, :stop => true
  action [:enable, :start]
  only_if "ls /etc/sysconfig/iptables"
end

template "#{node[:iptables][:path]}/iptables" do
  source "iptables.erb"
  owner "root"
  group "root"
  mode "0644"
  notifies :restart, "service[iptables]"
end

一瞬 service リソースの action を nothing にしようかとも思ったけど、そうすると「何らかの理由で手動で iptables を止めて、かつ設定ファイルに変更がない」場合に chef-solo 実行でサービスが起動できないのでやめました。