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

chef_logo

この記事は公開されてから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

AWS Cloud Roadshow 2017 福岡

  • Blufe

    暗号化したdatabagをusers_manageから利用、もしくは代替案についてもしご存知でしたらご教授いただけないでしょうか?
    やはり手を加える他ないでしょうか。。。