LoginSignup
12
10

More than 5 years have passed since last update.

Itamae で firewalld を操作する itamae-plugin-resource-firewalld

Last updated at Posted at 2014-12-22

gongo/itamae-plugin-resource-firewalld

経緯

  • 訳あって CentOS 7 の provisioning の手順をコードに落としたくなり、最近熱いという噂の Itamae でやってみたくなった。
  • しかし、CentOS 7 からは慣れ親しんだ iptables コマンドではなく firewalld という野郎が表に出てきたということらしい
  • itamae-plugin-resource-iptables であれば存在するが firewalld 用は無かった。execute resource をがんばって繋げていけばもちろんできるが美しくない

    # recipe.rb
    execute 'firewall-cmd --zone public --add-service http'
    execute 'firewall-cmd --zone public --remove-service dhcpv6-client'
    

    こんな感じになってしまう。シェルスクリプトで良さそう。

というわけで firewalld 用 resource plugin を書こうと思いました。

Recipe Plugin について

当初 Resource Plugin or Recipe Plugin で考えていましたが、recipe は既存の resource を組合せていくイメージで、結局中で execute を連ねていきそうだったので、せっかくだからということで新しい resource を生み出すことにしました。

Firewalld とは

Usage

Zone configuration

service 'firewalld' do
  action [:start, :enable]
end

firewalld_zone 'public' do
  interfaces %w(eth0)
  services   %w(ssh https mysql)
  ports      %w(8080/tcp 4243/udp)

  masquerade   true
  default_zone true

  notifies :restart, 'service[firewalld]'
end

こいつを実行するとこんな感じになります。

$ sudo firewall-cmd --list-all --zone public
public (default, active)
  interfaces: eth0
  sources:
  services: https mysql ssh
  ports: 4243/udp 8080/tcp
  masquerade: yes
  forward-ports:
  icmp-blocks:
  rich rules:

Service define

その他の機能としては、独自サービスの追加:

firewalld_service 'my-ssh' do
  short       'my-ssh'
  description 'My ssh that customized port'
  protocol    'tcp'
  port        '2222'
end

# 削除する時はこんな感じ
# firewalld_service 'my-ssh' do
#   action :delete
# end

実行後、対象マシンに /etc/firewalld/services/my-ssh.xml が作成される

<?xml version='1.0' encoding='UTF-8'?>
<service>
  <short>my-ssh</short>
  <description>My ssh that customized port</description>
  <port port='2222' protocol='tcp'/>
</service>

[おまけ] テストについて

itamae-plugin-resource-xxx 系のテスト、どうやって書けばいいんだろうと悩んでいます。

あまり量は無い感じ。最終的には ↓ こんな感じで落ち着きました。

itamae-plugin-resource-firewalld/test/itamae/plugin/resource

assert 系はほぼ使わず、最後に到達する run_commandrun_specinfra期待する引数が渡されるか というところに重点を起きました。(結果に関しては関与しない。Itamae や Specinfra の run_command 系メソッドに任せる形で)

余談ですが

普段は RSpec でテスト書いてますが、今回は

test-unit + mocha

で行いました。test-unit-rr が一般的なのかな?と思いましたが。とりあえずお試しも兼ねて。今のところ RSpec 並に書けて無問題。

まとめ

Itamae 便利だし :sushi: 食いたい

参考

12
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
10