LoginSignup
1
1

More than 5 years have passed since last update.

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

Posted at

chef-soloの構成コンセプト

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

クックブック、レシピの構成

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

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

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

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

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アドレスのサーバに対して、どのレシピを実行するのかを定義するのがノードファイルになります。

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

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

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

roles

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

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などがつくられるイメージになります。

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での管理とわけています。

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にいれています。

/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の構成ファイルの設定まとめでした。

連載してます

東洋経済オンラインで、エンジニア漫画の連載やってます。
エンジニア夫婦のあるある日記
bohebohe

1
1
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
1
1