Chef を始める #3 – ユーザ作成を自動化する 〜 Data Bags を使ってみる 〜
前回は、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