[chef]サーバアカウントの管理と公開鍵の登録

最近は、いよいよchefの本格的な運用に向けてrecipeを書く日々が続いています。
その中から一コマをご紹介。

Roleで登録するユーザを分ける

chefでサーバのアカウント管理をすることになって、どのようにするのが効率的かを考えました。
登録するアカウントは全てのサーバで同じというわけではなく、属性によって異なります。
そこで、属性ごとにRoleを用意して、それぞれユーザをattributeで登録することにしました。
ユーザ登録のRecipeは共通です。

Roleはこんな感じ。

{
  "json_class": "Chef::Role",
  "description": "desc",
  "default_attributes": {
    "users": [
      {
        "active": true,
        "uid": 10001,
        "key": "ssh-rsa xxxxxx",
        "name": "user1"
      },
      {
        "active": true,
        "uid": 10002,
        "key": "ssh-rsa yyyyyy",
        "name": "user2"
      }
    ]
  },
  "env_run_lists": {
  },
  "override_attributes": {
  },
  "name": "group1",
  "run_list": [
    "recipe[add_user]",
  ],
  "chef_type": "role"
}

attributeでusersという配列を用意して、その中に以下の要素を持ったオブジェクトを入れています。

  • 名前
  • UID
  • 公開鍵文字列
  • active flag

forのloopでユーザ登録

RecipeではRoleのattribute[users]を参照しながらresource[user]でユーザを登録します。
usersは配列なのでRecipeの中でforのloopを使います。
このresource[user]ですが、不要になったアカウントを削除すれば勝手にaction :removeがはしるかと期待したんですが、そううまく行かなかったので、activeフラグを用意して、不要になったユーザはそれををfalseに変更するとaction :removeになるようにRecipeを作りました。

作ったrecipeは以下のような感じです。

# User add or delete
for u in node["users"]

 # activeがfalseなら削除
 user_act = u["active"] ? "create" : "remove"

 # ホームディレクトリの文字列作成
 home_dir = "/home/" + u["name"]

 # useradd
 user u["name"] do
  uid u["uid"]
  gid "users"
  shell "/bin/bash"
  home home_dir
  action user_act
 end
end

公開鍵の登録

こんな感じでユーザを登録して、ついでにログインするための公開鍵の登録もします。
公開鍵の情報はあらかじめRoleのattributeに登録しておきます。
authorized_keysを作るresourceはfileを使いました。

 # .ssh directory
 ssh_dir = home_dir + "/.ssh"
 # authorized_keys
 authorized_keys = ssh_dir + "/authorized_keys"

 # .ssh directory作成
 if u["active"]
  directory ssh_dir do
   owner u["name"]
   group "ssh_users"
   mode  0700
  end
  
  # authorized_keyの作成
  if u["key"]
   file authorized_keys do
    owner u["name"]
    mode  0600
    content u["key"] + " " + u["name"]
   end
  end

これは実際はさっきのforの中に入っています。

これで、アカウント登録と公開鍵の登録は完了です。

やっぱりchefを使うメリットは同じ機能のサーバを同じ設定に出来るところ。
こんなのを普通にしこしこやったら絶対に設定漏れが出てしまう良い例だと思う。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です