chef-soloの構成コンセプト
レシピの適用は、knife-soloで実行しています。
レシピを作成している際に、とりあえずたくさんのレシピをつなげて作成していくと
やはり見通しがわるくなってしまったので、クックブックとレシピの構成にルールをつくってみました。
クックブック、レシピの構成
クックブックの単位を、機能にわけています。
例えば、HttpServerであれば、apacheやnginxなどの選択があるかと思います。
クックブック:HttpServer
それに含まれるレシピとして:apache.rb / nginx.rbなどとしています。
クックブック:Database
それに含まれるレシピとして:mysql.rb / oracle.rbなどとしています。
ディレクトリは略していますが以下のようなイメージです。
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アドレスのサーバに対して、どのレシピを実行するのかを定義するのがノードファイルになります。
{
"kind":"webserver",
"environment":"development",
"run_list":["role[webserver]"]
}
ノードファイルには、実行する __レシピではなく、レシピの集合であるロール__を記述するようにしています。
environment の設定をすることで、環境別に用意された環境ファイルを使うようにしています。
このノードファイルをみることで、このサーバはどういう状態であるべきかがわかるようにしています。
役割としては、Webserverである。
設置されている環境はdevelopmentである。
roles
ノードファイルに記述した__レシピの集合であるロール__をみてみましょう。
roleのファイルでは、どのようなレシピが実行されるべきなのかを具体的に記述したものになります。
"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などがつくられるイメージになります。
{
"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での管理とわけています。
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にいれています。
{
"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の構成ファイルの設定まとめでした。
連載してます
東洋経済オンラインで、エンジニア漫画の連載やってます。
エンジニア夫婦のあるある日記