2013/05/18

さくらのVPSのCentOS 6.4環境でChef 11を使ってみる [Cookbook, Recipeの作成 / Nodeへの設定反映]

はじめに

前回は、2つのさくらのVPSのCentOS環境を用意して、1台にChef-Server、及びWorkstation環境を、もう1台にNode環境をセットアップしました。

今回はこれらの環境を利用して、Cookbooks、Recipe作成し、Nodeへ設定を適用する動作を確認してみます。
具体的には、単純に1台のNodeに対して、iptablesの設定ファイルを適用するという内容から、ChefのServer / Client構成の動作を確認することを主目的とします。
※Cookbook、Recipeの作成について細かい内容について説明していません。

Nodeの登録とCookbookの作成/Recipeの実行環境構築

環境

上述の通り、今回は2台のマシンを用います。1台は前回セットアップしたChef Server兼Workstation環境で、もう1台がNodeと呼ばれるChefによる構成管理対象のClient環境です。
いずれもCentOS 6.4環境です。

Chef Server, Client(Workstation)環境
プラットフォーム さくらのVPS(1G SSDモデル)
OS CentOS 6.4 x86_64 (64bit)
ホスト名 hoge01(.sakura.ne.jp) (仮称)

Node環境
プラットフォーム さくらのVPS(512モデル)
OS CentOS 6.4 x86_64 (64bit)
ホスト名 hoge02(.sakura.ne.jp) (仮称)
Chefリポジトリの取得

まず、Workstation(hoge01.sakura.ne.jp)へChefのリポジトリを準備する必要があります。

リポジトリにはChefの実行に必要なファイル(Cookbooks, role, environments…)が含まれており、KnifeコマンドでChef ServerへリポジトリのデータをアップロードしてNodeの管理に利用します。
なおこのリポジトリはGitやSubversionなどのバージョン管理システムで管理することが推奨されていますが、ここではその設定は省きます。

雛型レポジトリが Github で公開されていますので、これを取得します。ここでは/usr/local/src以下に配置します。

# cd /usr/local/src
# git clone https://github.com/opscode/chef-repo
Cookbook作成

Workstation(hoge01.sakura.ne.jp)上からknfieコマンドを実行して、Cookbookを作成します。CookbooksはRecipeやtemplateなどの設定情報です。

ファイル名はcentos6_iptablesとしています。Cookbookのディレクトリはデフォルトでは/var/chef/cookbooks以下に作成されるようですが、-oオプションで作成先を指定できます。ここでは、先ほど取得したリポジトリ内の/usr/local/src/chef-repo/cookbooks以下に作成します、

# knife cookbook create centos6_iptables -o /usr/local/src/chef-repo/cookbooks
** Creating cookbook centos6_iptables
** Creating README for cookbook: centos6_iptables
** Creating CHANGELOG for cookbook: centos6_iptables
** Creating metadata for cookbook: centos6_iptables
Recipeの作成

Workstation(hoge01.sakura.ne.jp)上でRecipeのファイルを作成します。Recipeはサーバの設定内容やNodeへの反映処理をRubyで記述したファイル類です。

ここでは、CentOS6のFW(iptables)の設定ファイルを作成することにします。

まず、/usr/local/src/chef-repo/cookbooks/centos6_iptables/templates/default以下に設定ファイルの雛形を作成します。
※IPアドレスの箇所は適宜読み替えてください。

# cd /usr/local/src/chef-repo/cookbooks/centos6_iptables/templates/default
# vim iptables
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [88:5535]
:LOG_PINGDEATH - [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -s XXX.XXX.XXX.0/23 -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -f -j LOG --log-prefix "[IPTABLES FRAGMENT] : "
-A INPUT -f -j DROP
-A INPUT ! -s XXX.XXX.XXX.0/23 -p tcp -m multiport --dports 135,137,138,139,445 -j DROP
-A INPUT ! -s XXX.XXX.XXX.0/23 -p udp -m multiport --dports 135,137,138,139,445 -j DROP
-A INPUT -p icmp -m icmp --icmp-type 8 -j LOG_PINGDEATH
-A INPUT -d 255.255.255.255/32 -j DROP
-A INPUT -d 224.0.0.1/32 -j DROP
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -m limit --limit 1/sec -j LOG --log-prefix "[IPTABLES INPUT] : "
-A INPUT -j DROP
-A INPUT -s 10.0.0.0/8 -i eth0 -j DROP
-A INPUT -s 172.16.0.0/12 -i eth0 -j DROP
-A INPUT -s 192.168.0.0/16 -i eth0 -j DROP
-A INPUT -d 10.0.0.0/8 -i eth0 -j DROP
-A INPUT -d 172.16.0.0/12 -i eth0 -j DROP
-A INPUT -d 192.168.0.0/16 -i eth0 -j DROP
-A INPUT -d 255.255.255.255/32 -i eth0 -j DROP
-A INPUT -d 224.0.0.1/32 -i eth0 -j DROP
-A FORWARD -m limit --limit 1/sec -j LOG --log-prefix "[IPTABLES FORWARD] : "
-A FORWARD -j DROP
-A OUTPUT ! -d XXX.XXX.XXX.0/23 -p tcp -m multiport --sports 135,137,138,139,445 -j DROP
-A OUTPUT ! -d XXX.XXX.XXX.0/23 -p udp -m multiport --sports 135,137,138,139,445 -j DROP
-A LOG_PINGDEATH -m limit --limit 1/sec --limit-burst 4 -j ACCEPT
-A LOG_PINGDEATH -j LOG --log-prefix "[IPTABLES PINGDEATH] : "
-A LOG_PINGDEATH -j DROP
COMMIT

/usr/local/src/chef-repo/cookbooks/centos6_iptables/recipes以下にRecipeのファイルを作成します。
デフォルトでdefault.rbというファイルがありますがこれは修正せず、別途iptables.rbというファイルを以下の内容で作成します。
これは上記で作成したiptablesというTemplateファイルを用いて、/etc/sysconfig/iptablesというファイルをユーザ/グループをroot、パーミッション0を600で生成し、その後iptablesを再起動する、というRecipeです。

# cd /usr/local/src/chef-repo/cookbooks/centos6_iptables/recipes
# vim iptables.rb
template "/etc/sysconfig/iptables" do
  source "iptables"
  group "root"
  owner "root"
  mode "0600"
end

service "iptables" do
  supports :status => true, :restart => true
  action [ :enable, :start ]
end

/usr/local/src/chef-repo/cookbooks/centos6_iptables以下に、NodeからChef Serverに対してchef-clientコマンドによるAPIが実行された際に適用するレシピがJSON形式で定義されたファイルを作成します。
run_listはNodeに対して適用するRecipeを指定したリストを指し、その中の"recipe[centos6_iptables::iptables]"はcentos6_iptablesというCookbookのrecipes/iptables.rbというファイルの内容を実行する、という内容を表します。

# cd /usr/local/src/chef-repo/cookbooks/centos6_iptables/recipes
# vim iptables.json
{
  "run_list": [
    "recipe[centos6_iptables::iptables]"
  ]
}

以上で、Cookbook、Recipeの作成は完了です。

Cookbookのアップロード

Workstation(hoge01.sakura.ne.jp)からChef Server(hoge01.sakura.ne.jp)へ、作成したCookbookをアップロードして登録します。 ※ここではChef ServerとWorkstationは同一のサーバです。

# knife cookbook upload -a -o /usr/local/src/chef-repo/cookbooks
Uploading centos6_iptables [0.1.2]
Uploaded all cookbooks.
Cookbook、RecipeがChef Serverへ登録されていることを確認します。
# knife cookbook list
centos6_iptables   0.1.0
# knife recipe list
centos6_iptables::iptables
NodeへのRecipe追加

Chef Server(hoge01.sakura.ne.jp)へ登録したCookbookのRecipeを、適用したいNode(hoge02.sakura.ne.jp)へ追加します。

# knife node run_list add hoge2.sakura.ne.jp "recipe[centos6_iptables::iptables]"
hoge2.sakura.ne.jp:
  run_list:
    recipe[centos6_iptables]
    recipe[centos6_iptables::iptables]

Workstaton(hoge01.sakura.ne.jp)上からNode(hoge02.sakura.ne.jp)の状態を確認し、Recipeが登録されていることを確認します。

# knife node show hoge2.sakura.ne.jp
Node Name:   hoge2.sakura.ne.jp
Environment: _default
FQDN:        hoge2.sakura.ne.jp
IP:          XXX.XXX.XXX.XXX
Run List:    recipe[centos6_iptables::iptables]
Roles:
Recipes:    centos6_iptables::iptables
Platform:    centos 6.4
Tags:
Recipeの実行

Node(hoge02.sakura.ne.jp)からchef-clientコマンドを実行し、Recipeの内容をNodeへ反映します。

% sudo chef-client
Starting Chef Client, version 11.4.4
[2013-05-18T02:30:12+09:00] INFO: *** Chef 11.4.4 ***
[2013-05-18T02:30:12+09:00] INFO: [inet6] no default interface, picking the first ipaddress
[2013-05-18T02:30:13+09:00] INFO: Run List is [recipe[centos6_iptables], recipe[centos6_iptables::iptables]]
[2013-05-18T02:30:13+09:00] INFO: Run List expands to [centos6_iptables, centos6_iptables::iptables]
[2013-05-18T02:30:13+09:00] INFO: Starting Chef Run for hoge2.sakura.ne.jp
[2013-05-18T02:30:13+09:00] INFO: Running start handlers
[2013-05-18T02:30:13+09:00] INFO: Start handlers complete.
resolving cookbooks for run list: ["centos6_iptables", "centos6_iptables::iptables"]
[2013-05-18T02:30:13+09:00] INFO: Loading cookbooks [centos6_iptables]
Synchronizing Cookbooks:
  - centos6_iptables
Compiling Cookbooks...
Converging 2 resources
Recipe: centos6_iptables::iptables
  * template[/etc/sysconfig/iptables] action create[2013-05-18T02:30:13+09:00] INFO: Processing template[/etc/sysconfig/iptables] action create (centos6_iptables::iptables line 1)
[2013-05-18T02:30:13+09:00] INFO: template[/etc/sysconfig/iptables] updated content
[2013-05-18T02:30:13+09:00] INFO: template[/etc/sysconfig/iptables] owner changed to 0
[2013-05-18T02:30:13+09:00] INFO: template[/etc/sysconfig/iptables] group changed to 0
[2013-05-18T02:30:13+09:00] INFO: template[/etc/sysconfig/iptables] mode changed to 600

    - create template[/etc/sysconfig/iptables]
        --- /tmp/chef-tempfile20130518-17671-jz7mdd     2013-05-18 02:30:13.497129975 +0900
        +++ /tmp/chef-rendered-template20130518-17671-19zoijp   2013-05-18 02:30:13.497129975 +0900
        @@ -0,0 +1,57 @@
        +*filter
        +:INPUT DROP [0:0]
        +:FORWARD DROP [0:0]
        +:OUTPUT ACCEPT [88:5535]
        +:LOG_PINGDEATH - [0:0]
        +-A INPUT -i lo -j ACCEPT
        +-A INPUT -s XXX.XXX.XXX.0/23 -j ACCEPT
        +-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
        +-A INPUT -f -j LOG --log-prefix "[IPTABLES FRAGMENT] : "
        +-A INPUT -f -j DROP
        +-A INPUT ! -s XXX.XXX.XXX.0/23 -p tcp -m multiport --dports 135,137,138,139,445 -j DROP
        +-A INPUT ! -s XXX.XXX.XXX.0/23 -p udp -m multiport --dports 135,137,138,139,445 -j DROP
        +-A INPUT -p icmp -m icmp --icmp-type 8 -j LOG_PINGDEATH
        +-A INPUT -d 255.255.255.255/32 -j DROP
        +-A INPUT -d 224.0.0.1/32 -j DROP
        +-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
        +-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
        +-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
        +-A INPUT -m limit --limit 1/sec -j LOG --log-prefix "[IPTABLES INPUT] : "
        +-A INPUT -j DROP
        +-A INPUT -s 10.0.0.0/8 -i eth0 -j DROP
        +-A INPUT -s 172.16.0.0/12 -i eth0 -j DROP
        +-A INPUT -s 192.168.0.0/16 -i eth0 -j DROP
        +-A INPUT -d 10.0.0.0/8 -i eth0 -j DROP
        +-A INPUT -d 172.16.0.0/12 -i eth0 -j DROP
        +-A INPUT -d 192.168.0.0/16 -i eth0 -j DROP
        +-A INPUT -d 255.255.255.255/32 -i eth0 -j DROP
        +-A INPUT -d 224.0.0.1/32 -i eth0 -j DROP
        +-A FORWARD -m limit --limit 1/sec -j LOG --log-prefix "[IPTABLES FORWARD] : "
        +-A FORWARD -j DROP
        +-A OUTPUT ! -d XXX.XXX.XXX.0/23 -p tcp -m multiport --sports 135,137,138,139,445 -j DROP
        +-A OUTPUT ! -d XXX.XXX.XXX.0/23 -p udp -m multiport --sports 135,137,138,139,445 -j DROP
        +-A LOG_PINGDEATH -m limit --limit 1/sec --limit-burst 4 -j ACCEPT
        +-A LOG_PINGDEATH -j LOG --log-prefix "[IPTABLES PINGDEATH] : "
        +-A LOG_PINGDEATH -j DROP
        +COMMIT

  * service[iptables] action enable[2013-05-18T02:30:13+09:00] INFO: Processing service[iptables] action enable (centos6_iptables::iptables line 8)
 (up to date)
  * service[iptables] action restart[2013-05-18T02:30:13+09:00] INFO: Processing service[iptables] action restart (centos6_iptables::iptables line 8)
[2013-05-18T02:30:15+09:00] INFO: service[iptables] restarted

    - restart service service[iptables]

[2013-05-18T02:30:15+09:00] INFO: Chef Run complete in 1.948886938 seconds
[2013-05-18T02:30:15+09:00] INFO: Running report handlers
[2013-05-18T02:30:15+09:00] INFO: Report handlers complete
Chef Client finished, 2 resources updated

Node(hoge02.sakura.ne.jp)上から、iptablesの設定が反映されていることを確認します。

% sudo service iptables status
Table: filter
Chain INPUT (policy DROP)
num  target     prot opt source               destination
1    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
2    ACCEPT     all  --  XXX.XXX.XXX.0/23      0.0.0.0/0
3    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
4    LOG        all  -f  0.0.0.0/0            0.0.0.0/0           LOG flags 0 level 4 prefix `[IPTABLES FRAGMENT] : '
5    DROP       all  -f  0.0.0.0/0            0.0.0.0/0
6    DROP       tcp  -- !XXX.XXX.XXX.0/23      0.0.0.0/0           multiport dports 135,137,138,139,445
7    DROP       udp  -- !XXX.XXX.XXX.0/23      0.0.0.0/0           multiport dports 135,137,138,139,445
8    LOG_PINGDEATH  icmp --  0.0.0.0/0            0.0.0.0/0           icmp type 8
9    DROP       all  --  0.0.0.0/0            255.255.255.255
10   DROP       all  --  0.0.0.0/0            224.0.0.1
11   ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:22
12   ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:80
13   ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:443
14   LOG        all  --  0.0.0.0/0            0.0.0.0/0           limit: avg 1/sec burst 5 LOG flags 0 level 4 prefix `[IPTABLES INPUT] : '
15   DROP       all  --  0.0.0.0/0            0.0.0.0/0
16   DROP       all  --  10.0.0.0/8           0.0.0.0/0
17   DROP       all  --  172.16.0.0/12        0.0.0.0/0
18   DROP       all  --  192.168.0.0/16       0.0.0.0/0
19   DROP       all  --  0.0.0.0/0            10.0.0.0/8
20   DROP       all  --  0.0.0.0/0            172.16.0.0/12
21   DROP       all  --  0.0.0.0/0            192.168.0.0/16
22   DROP       all  --  0.0.0.0/0            255.255.255.255
23   DROP       all  --  0.0.0.0/0            224.0.0.1

Chain FORWARD (policy DROP)
num  target     prot opt source               destination
1    LOG        all  --  0.0.0.0/0            0.0.0.0/0           limit: avg 1/sec burst 5 LOG flags 0 level 4 prefix `[IPTABLES FORWARD] : '
2    DROP       all  --  0.0.0.0/0            0.0.0.0/0

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination
1    DROP       tcp  --  0.0.0.0/0           !XXX.XXX.XXX.0/23     multiport sports 135,137,138,139,445
2    DROP       udp  --  0.0.0.0/0           !XXX.XXX.XXX.0/23     multiport sports 135,137,138,139,445

Chain LOG_PINGDEATH (1 references)
num  target     prot opt source               destination
1    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           limit: avg 1/sec burst 4
2    LOG        all  --  0.0.0.0/0            0.0.0.0/0           LOG flags 0 level 4 prefix `[IPTABLES PINGDEATH] : '
3    DROP       all  --  0.0.0.0/0            0.0.0.0/0

以上で、Node(hoge02.sakura.ne.jp)に対して、Recipeの内容が実行されたことが確認できました。

おわりに

ここでは単純にChefのServer / Client構成の動作を確認するために、iptablesの設定を例として簡単に設定ファイルを作成して、Nodeへ反映するという動作を確認してみました。 細かい動作や用語などまだ分からない部分もたくさんありますが、いろいろ弄っている中でとりあえず初歩的な部分は把握できたような気がします。
Chefの環境構築とその基本動作が確認できたので、もう少し凝ったRecipeの作成などをやってみようかと思います。

0 Comments:

コメントを投稿