Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

More than 5 years have passed since last update.

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

bohebohechan
developer & founder of First Four Notes, LLC. I write 4 panel comic on Toyo-Keizai Online. http://toyokeizai.net/category/diary
https://firstfournotes.com/
firstfournotes
「音楽を演奏する人」、「音楽を聴く人」をソフトウエアとIoTの力で、より幸せにすることを目指してます。
https://firstfournotes.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away