Chef-soloファイルの構成コンセプト #chef #knife-solo

# chef-soloの構成コンセプト

レシピの適用は、knife-soloで実行しています。
レシピを作成している際に、とりあえずたくさんのレシピをつなげて作成していくと
やはり見通しがわるくなってしまったので、クックブックとレシピの構成にルールをつくってみました。


# クックブック、レシピの構成
クックブックの単位を、機能にわけています。
例えば、HttpServerであれば、apacheやnginxなどの選択があるかと思います。

__クックブック：HttpServer__
それに含まれるレシピとして：apache.rb / nginx.rbなどとしています。

__クックブック：Database__
それに含まれるレシピとして：mysql.rb / oracle.rbなどとしています。


ディレクトリは略していますが以下のようなイメージです。

```bash:site-cookbooks/HttpServer/
site-cookbooks/HttpServer/                                              
├── recipes              
│   ├── apache.rb
│   ├── apache-ssl.rb 
│   └── nginx.rb                                                                                                       
```

# environment, node, rolesの構成

chef(knife-solo) の実行時には、以下のコマンドで実行します。

```
knife solo cook 172.16.7.9
```
## nodes

上記で指定したIPアドレスのサーバに対して、どのレシピを実行するのかを定義するのがノードファイルになります。


```bash:nodes/172.16.7.9.json
{
  "kind":"webserver",
  "environment":"development",
  "run_list":["role[webserver]"]
}
```

ノードファイルには、実行する __レシピではなく、レシピの集合であるロール__を記述するようにしています。
__environment__ の設定をすることで、環境別に用意された環境ファイルを使うようにしています。

このノードファイルをみることで、このサーバはどういう状態であるべきかがわかるようにしています。
__役割としては、Webserverである。__
__設置されている環境はdevelopmentである。__

##roles

ノードファイルに記述した__レシピの集合であるロール__をみてみましょう。
roleのファイルでは、どのようなレシピが実行されるべきなのかを具体的に記述したものになります。

```bash:roles/webserver.json

  "name": "webserver",
  "chef_type": "role",
  "json_class": "Chef::Role",
  "default_attributes": {
  },
  "description": "The base role for systems that serve HTTP traffic",
  "run_list": [
    "yum",
    "recipe[Basic::yumrepo]",
    "recipe[ApplicationRuntime::php]",
    "recipe[HttpServer::apache]",
    "recipe[HttpServer::apache-ssl]",
    "recipe[LoadBalancer::haproxy14]",
    "recipe[LogManagement::fluent-agent-light10]"
  ],
  "env_run_lists" : {
    "production" : [],
    "staging" : [],
    "dev": []
   },
  "override_attributes": {
  }
}
```

ここでの環境別の設定はとくに行いません。

## environments

環境設定はまとめて、environmentsのファイルでおこないます。
environmentsのファイルでは、各環境毎にjsonファイルを作成し、環境毎に変わるもの、
例えばIPアドレス、MySQLのユーザーやパスワードなどを設定しておきます。

だいたい、development/productionなどがつくられるイメージになります。


```bash:environments/development.json
{
  "name": "development",
  "description":"variables depends on environment",
  "chef_type": "environment",
  "json_class": "Chef::Environment",
  "default_attributes": {
    "envkind":"development",
    "server": {
      "api_ipaddress": "172.16.7.54"
      ,"redis_ipaddress": "172.16.7.56"
      ,"mysql_master_ipaddress": "172.16.7.50"
      ,"mysql_slave_ipaddress": "172.16.7.50"
    },
    "mysql": {
      "admin_user": "adminsan"
      ,"admin_password": "hogehoge"
    }
  },
  "override_attributes": {}
}
```

上記のようにenvironment, node, rolesファイルを記述しています。


繰り返しになりますが、
ノードファイルをみることで、このサーバはどういう状態であるべきかがわかるようにしています。
__役割としては、Webserverである。__
__設置されている環境はdevelopmentである。__


# templatesの利用

apache.conf,haproxy.conf,zabbix.confの設定ファイル系は、templatesにいれています。

confの中でも変数となるものってありますよね。

それについては、environments/development.jsonなどで設定した値を利用することが可能なので、
環境毎に変わる変数については、environmentsでの管理。
変わらない変数については、attributesでの管理とわけています。

```bash:mysql-log-rotate.erb
    postrotate
    # just if mysqld is really running
    if test -x /usr/bin/mysqladmin && \
       /usr/bin/mysqladmin ping &>/dev/null
    then
       /usr/bin/mysql -u <%= node['mysql']['admin_user'] %> -p<%= node['mysql']['admin_password'] %> -e'flush error logs;'
    fi
    endscript
}
```


# DataBagの利用

本からの引用ですが、ノードの「属性」でもないし、Resourceの「属性」でもないデータをDataBagで扱います。
例えば、ユーザーの各種データなどです。

ユーザーを作成するときに使うデータなどをDataBagにいれています。

```bash:/data_bags/users/yamada.json
{
  "id":"yamada",
  "username":"yamada",
  "home":"/home/yamada",
  "uid":"503",
  "group":"dev",
  "password":"$1$YzrPVksB$1vl69RRRRRRRRRRRRRRRRRR",
  "ssh_keys":"ssh-rsa AAXDM9HSrz= hoge-2013-06-10",
  "shell":"/bin/bash"
}
```

以上、ひととおりのChefの構成ファイルの設定まとめでした。

# 連載してます

東洋経済オンラインで、エンジニア漫画の連載やってます。
[エンジニア夫婦のあるある日記](http://toyokeizai.net/search/author?category%5B%5D=TK%3E%E8%A8%98%E4%BA%8B&category%5B%5D=TK%3E%E5%A4%96%E5%A0%B1&author_name=%E3%81%BC%E3%81%B8%E3%81%BC%E3%81%B8)
![bohebohe](http://tk.ismcdn.jp/mwimgs/6/0/-/img_6027d31591e9809474754482881bf99a85306.jpg)