Chef を始める #3 – ユーザ作成を自動化する 〜 Data Bags を使ってみる 〜

2013.05.27

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

前回は、Chef Client をインストールしたノード上から、簡単な Cookbook を実行するところまで試しました。
今回は比較的よく使いそうな、ユーザ作成を行う Cookbook を試してみようと思います。

GitHub からユーザ作成の Cookbook をクローン

opscode の GitHub から users という Cookbook をクローンします。

$ cd ~/chef/chef-repo/cookbooks
$ git clone git@github.com:opscode-cookbooks/users.git
$ cd users

ディレクトリ構成はこんな感じ。

$ tree
.
├── CHANGELOG.md
├── CONTRIBUTING
├── LICENSE
├── README.md
├── metadata.rb
├── providers
│   └── manage.rb
├── recipes
│   ├── default.rb
│   └── sysadmins.rb
├── resources
│   └── manage.rb
└── templates
    └── default
        ├── authorized_keys.erb
        ├── private_key.erb
        └── public_key.pub.erb

providers(プロバイダ)ディレクトリと、resources(リソース)ディレクトリがありますが、
これは Chef の LWRPs(Lightweight Resources and Providers)という Recipe の記述を簡単にする仕組みで使われます。

  • リソース・・・アクションと属性のセットを定義するもの。
  • プロバイダ・・・リソースで定義されたアクションの具体的な処理内容を記述するもの。属性も使う事が可能。

ディレクトリの中には、manage.rb というファイルがあって、これによって、users_manage という独自DSLを Recipe 内で使用することが出来ます。
http://docs.opscode.com/lwrp_users.html

レシピを書く

上記の users_manage を使って Recipe を書きましょう。

$ cd recipes
$ vim classmethods.rb
users_manage "classmethod" do
   group_id 2300
   action [ :remove, :create ]
end

上記は、classmethod というグループを作成するレシピです。

Cookbook のアップロードと Run List への登録

Cookbook を Chef Server にアップします。

$ ~/chef/chef-repo/cookbooks
$ knife cookbook upload users -o .
Uploading users          [1.5.1]
Uploaded 1 cookbook.

作成したレシピも web-server の Run List として登録しましょう。

$ knife node run_list add web-server users::classmethods
web-server:
  run_list: recipe[users::classmethods]

Data Bag の作成

次は Data Bag の作成です。
users の Recipe は、Data Bag からユーザ情報を探して作成する仕組みになっています。

Data Bag って?

json 形式で Chef Server に保存される値で、Recipe 等から参照できます。
用途としては、ユーザ情報を保存したり、DBの接続情報を保存したりして使う事が多いかな〜と思ってます。

ユーザ作成に必要な情報を生成

最初に、Data Bag に含めるユーザのパスワードやサーバに登録する鍵を作ります。
まずは、パスワードの生成。

$ openssl passwd -1 'password'
$1$8Filc8Et$WCbooMSmIwIS3PalzwnCx/

続いて、公開鍵と秘密鍵の作成。

$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/yamato/.ssh/id_rsa): /Users/yamato/chef-test/.ssh/id_rsa
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /Users/yamato/chef-test/.ssh/id_rsa.
Your public key has been saved in /Users/yamato/chef-test/.ssh/id_rsa.pub.

上記で得た内容を元に json ファイルに記述します。

$ cd ~/chef/chef-repo/data_bags
$ mkdir users && cd users
$ vim blogger.json
{
  "id": "blogger",
  "password": "$1$8Filc8Et$WCbooMSmIwIS3PalzwnCx/"
  "ssh_keys": "ssh-rsa ...",
  "groups": [ "classmethod" ],
  "uid": 1000,
  "comment": "Classmethod Blogger",
  "shell": "\/bin\/bash"
}

ssh_keys には、作成した公開鍵を指定します。
groups に classmethod が指定されているので、上の Recipe が実行されると、この Data Bag が検索されて実行されるという流れです。

最初に knife コマンドで、users という data bag を作成します。

$ knife data bag create users
Created data_bag[users]

作成した json ファイルを users の data bag item として Chef Server にアップロードします。

$ knife data bag from file users blogger.json
Updated data_bag_item[users::blogger]

レシピを実行する

ノードにログインして Chef Client を実行します。

$ sudo chef-client
Starting Chef Client, version 11.4.0
・
・
Chef Client finished, 6 resources updated

うまく終わりました。

確認してみる

ユーザが登録されていることを確認。

$ cat /etc/passwd
・
・
blogger:x:1000:1000:Classmethod Blogger:/home/blogger:/bin/bash

グループが登録されていることを確認。

$ cat /etc/group
・
・
blogger:x:1000:
classmethod:x:2300:blogger

sshでログインしてみる...

$ ssh -i id_rsa blogger@ec2-XXX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com

ログインできました!

Last login: Sat May 25 15:53:02 2013 from hoge

       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-ami/2013.03-release-notes/
[blogger@ip-xxx-xxx-xxx-xxx ~]$ 
[blogger@ip-xxx-xxx-xxx-xxx ~]$ id
uid=1000(blogger) gid=1000(blogger) 所属グループ=1000(blogger),2300(classmethod)

まとめ

今回は、ユーザ作成の Cookbook を使ってみました。
ただ、Recipe でグループ作成が基点になっているなど若干使い辛さを感じましたw
Recipe を修正してしまうか独自の Cookbook を作成した方がいいかもしれませんねw

あと、Databags は暗号化の機能も持っていますので、実際に使う際は暗号化した方がいいと思います。
ちなみに sudo 権限を付けたい場合は、以下の Cookbook と組み合わせて実現することもできたりします。
https://github.com/opscode-cookbooks/sudo