APF ファイアウォールの導入と設定のレシピ

#[SoftLayerクッキングLABO] (http://qiita.com/MahoTakara/items/464da29ccf932698b753)

# このレシピで出来ること

SoftLayer カスタマー・ポータルからサーバーをオーダーする場合には、OSファイアウォールのAPFの導入を設定できるのですが、コマンドラインからでは、APFをサーバーに導入する指定ができません。　このレシピでは、APFの導入、ルール設定、OS起動時の自動起動までを実現したいと思います。


# レシピの要約

この apf01 レシピでは、以下の作業を自動化しています。

- APFのファイルを管理対象サーバーに配置する
- APFのイントールを実行
- ファイアウォールのルールファイルを配置
- 起動スクリプトを Ubuntu 用に修正
- APFの起動設定
- サービスの起動


# レシピの説明
解説用のバージョンで、GitHubに登録したものが最新版です。

```
# 変数の定義 
filename = "apf-current.tar.gz"
file_checksum = "793d83ca2657b86b86a23b1c3fe08ee436df8c4a83ef84c92f0f11689531a2cc"
work_dir = "/root/_apf_work"

# APFインストール用のファイルを root のホームディレクトリに置く
cookbook_file "/root/#{filename}" do
  source "#{filename}"
  checksum "#{file_checksum}"
end

# APFを展開してインストールシェルを実行
script "install_apf" do
  interpreter "bash"
  user        "root"
  code <<-EOL
    install -d #{work_dir}
    tar zxvf /root/#{filename} -C #{work_dir}
    cd #{work_dir}/apf-9.7-2
    sh install.sh
  EOL
end

# APFの設定ファイルをテンプレートから作成します
template "/etc/apf/conf.apf" do
  owner "root"
  group "root"
  mode 0640
  source "conf.apf.erb"
  action :create
end

#
# Debian/Ubuntuでは起動シェルに変更を加える
# RedHat/CentOS 7 では、ifconfig　を追加でインスールする
#
case node['platform']
when 'ubuntu','debian'
  bash "edit /etc/init.d/apf" do
    only_if { File.exists?("/etc/init.d/apf") }
    code <<-EOC
      sed -i -e "s/^\\. \\/etc\\/rc.d\\/init.d\\/functions/# &/g" /etc/init.d/apf;
      sed -i -e "s/echo_success/# &/g" /etc/init.d/apf
    EOC
  end
  #
  execute 'update-rc.d apf defaults' do
    command "update-rc.d apf defaults"
  end
when 'centos','redhat'
  if node['platform_version'].to_i == 7 then
    package 'net-tools' do
      action :install
    end
  end
end  # node['platform']

# 
service "apf" do
  action [:enable, :start]
end
```

# 対応するソフトレイヤー活用ガイド
- [2.1 ファイアウォールを導入するには？](https://www.change-makers.jp/post/10323)
- [2.2 OSファイアウォールの設定方法は？](https://www.change-makers.jp/post/10324)

# 確認済みのLinuxディストリビューション

- Ubuntu 14.04 64bit minimal install
- CentOS 7 64bit minimal install 
- CentOS 6 64bit minimal install
- Debian 7 64bit minimal install


# レシピの置き場所

- [GitHub https://github.com/takara9/chef-repo/tree/master/site-cookbooks/apf01] (https://github.com/takara9/chef-repo/tree/master/site-cookbooks/apf01)

# Chef 関連マニュアル
- cookbook_file  (https://docs.chef.io/resource_cookbook_file.html )
- script  (https://docs.chef.io/resource_script.html )
- template  (https://docs.chef.io/resource_template.html )
- bash  (https://docs.chef.io/resource_bash.html )
- execute (https://docs.chef.io/resource_execute.html )
- service (https://docs.chef.io/resource_service.html )



# 管理対象サーバーへの設定実行
Chef-Solo を利用の例で、管理対象サーバーの状態によって、以下の２つのオプションを使い分けます。 

**初回 Chefのクライアントも含めてインストールする場合**

```
chef@ChefWs:~/chef-repo$ knife solo bootstrap 10.132.253.7 -x root -r 'recipe[apf01]' -i ~/key/chefkey
```

**既存の設定に更新する場合**

```
chef@ChefWs:~/chef-repo$ knife solo cook 10.132.253.7 -x root -r 'recipe[apf01]' -i ~/key/chefkey
```


# レシピ作成の準備

前述のGitHubからクローンする場合は、apfのtarファイルも含まれているので、以下の作業は必要なのですが、今後リリースされる apf の最新版を利用する場合を考慮して記載します。

Chefのリポジトリに移動して、ひな形を作っていきます。

```
chef@ChefWs:~/chef-repo$ pwd
/home/chef/chef-repo
```
knifeコマンドで site-cookbooks の下に apf01 というレシピを作ります。 cookbooks を作ると knife solo コマンドを動かした場合、削除されるので注意が必要です。

```
chef@ChefWs:~/chef-repo$ knife cookbook create apf01 -o site-cookbooks
** Creating cookbook apf01 in /home/chef/chef-repo/site-cookbooks
** Creating README for cookbook: apf01
** Creating CHANGELOG for cookbook: apf01
** Creating metadata for cookbook: apf01
```

apf01 というクックブックが出来ている事を確認

```
chef@ChefWs:~/chef-repo$ ls -l site-cookbooks/
合計 4
drwxrwxr-x 10 chef chef 4096 10月  1 22:11 apf01
```
最新のAPFをダウンロードして、apf01 クックブックの files/default に置くために、ディレクトリを移動します。

```
chef@ChefWs:~/chef-repo/cookbooks/apf01/files/default$ pwd
/home/chef/chef-repo/cookbooks/apf01/files/default
```
APFのホームページからダウンロードして、レシピ apf01 の files に保存します。

```
chef@ChefWs:~/chef-repo/cookbooks/apf01/files/default$ wget http://www.rfxn.com/downloads/apf-current.tar.gz
--2015-10-01 11:19:49--  http://www.rfxn.com/downloads/apf-current.tar.gz
www.rfxn.com (www.rfxn.com) をDNSに問いあわせています... 129.121.132.46
www.rfxn.com (www.rfxn.com)|129.121.132.46|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 107699 (105K) [application/x-gzip]
`apf-current.tar.gz' に保存中

100%[=======================================================================>] 107,699      149KB/s   時間 0.7s 

2015-10-01 11:19:55 (149 KB/s) - `apf-current.tar.gz' へ保存完了 [107699/107699]
```

後でレシピにセットするために sha256sum を計算しておきます。

```
chef@ChefWs:~/chef-repo/cookbooks/apf01/files/default$ sha256sum apf-current.tar.gz 
793d83ca2657b86b86a23b1c3fe08ee436df8c4a83ef84c92f0f11689531a2cc  apf-current.tar.gz
```

サーバー毎に個別に必要なファイアウォールのルールは、以下のテンプレートファイルを編集します。
> apf01/templates/conf.apf.erb