URAMIRAIKAN

1020のなれの果て (since 2005.6.19)

Ansibleでiptablesを再起動

 CentOS 6の環境をAnsibleを使って設定変更していた際に、serviceモジュールで"iptables"を再起動したら応答がなくなってしまい、しばらくしてタイムアウトになってしまいました。Playbookの実行結果としては"Failed"にもならず、そのまま切断されたような感じになりました。
 その対処のメモです。

 問題になったタスクは何の変哲もないサービスの再起動です。

tasks: - name: Restart iptables service: name: iptables state: restarted

 Ansibleにはiptablesモジュールもありますが、今回は"/etc/sysconfig/iptables"ファイルをcopyやtemplateモジュールで置き換えた後、サービスを再起動するという方法を取っていました。
 また、Ansibleのモジュールはコマンドと完全に同じ処理をするわけではありませんが、一応シェルで"service iptables restart"とやれば正常に適用される内容であることは確認しています。

 いろいろと調べているとCentOS 7でも似たような現象は起こるようです。

 カーネルモジュールまわりで何か悪さするのでしょうか。

 最終的にはこのリンク中でも言及されている通り、shellモジュールを使って"sleep"をはさみつつ非同期でサービス再起動を実行することで解決しました。

tasks: - name: Restart iptables shell: sleep 5 && /sbin/service iptables restart async: 10 poll: 0

 他の環境でも同じ事が起こるのか試したかったのですが、手元になかったのでそれは別の機会で。最近はCentOS 6を触ることもなくなってきたので、firewalld等を通さずにiptablesを直にいじることもなくなってきました。