今年も

やって参りました、初老丸アドベントカレンダー。今年は独りぢゃないのが嬉しい。

集え、初老丸達よ。初老丸達による世界に向けた技術的(又はそれに関連する)な物語を綴るカレンダーです。我こそ初老丸という方、初老丸予備軍の方も奮ってご参加下さい。

qiita.com

ということで、小ネタ大ネタを交えて 12/25 まで張り切っていきましょう。

itamae でユーザーを複数のグループに所属させるメモ

親方と見習い

親方:おい、見習い、なんしよーとや
親方:あー、あれだ、そのサーバーにユーザーを作る必要があるくさ、ユーザーは複数のグループに所属する必要があるったい、きーつけろや
見習い:はい、やってみますたい

包丁の準備

itamae の準備

$ mkdir itamae
$ cd itamae
$ cat Gemfile
source "https://rubygems.org"

gem "itamae"
gem "rake"
gem "aws-sdk"
gem "unix-crypt"

後は bundle install するだけったい。

$ bundle install --path vendor/bundle

尚、今回試す itamae のバージョンは以下の通り。最新のバージョンでは未確認ったい。

$ bundle exec itamae version
Itamae v1.9.9

Serverspec の準備

後で Serverspec もするので準備するったい。

$ mkdir serverspec
$ cd serverspec
$ cat Gemfile
# A sample Gemfile
source "https://rubygems.org"

gem "serverspec"
gem "rake"

後は bundle install するだけったい。

$ bundle install --path vendor/bundle

ということで、以下のようなディレクトリ構成にしておく

$ tree . -L 2
.
├── itamae
│   ├── Gemfile
│   ├── Gemfile.lock
│   ├── Rakefile
│   ├── cookbooks
│   ├── roles
│   ├── sandbox.json
│   ├── ssh_config
│   └── vendor
└── serverspec
    ├── Gemfile
    ├── Gemfile.lock
    ├── Rakefile
    ├── properties.yml
    ├── spec
    ├── ssh_config
    └── vendor

ということで、パスワードは SHA512 でハッシュ

SHA512 でハッシュするにはmkunixcryptという Gem があるので、それを利用すれば良かと。

$ cd itamae
$ bundle exec mkunixcrypt -s "sandbox"

実行すると以下のように出力されると。

Enter password:
Verify password:
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx #=> SHA512 でハッシュされたパスワード

上記で出力されたハッシュされたパスワード文字列を貼り付けると。

sandbox.json にユーザーを定義

sanbbox.json に作成したいユーザーやユーザー ID 等を以下のように記載したったい。

$ cd itamae
$ cat sandbox.json
{
  "groups": [
    {
      "groupname": "pika",
      "gid": 30000
    },
    {
      "groupname": "hage",
      "gid": 30100
    }
  ],
  "users": [
    {
      "username": "pika",
      "groupname": ["pika", "hage"],
      "uid": 30000,
      "gid": 30000,
      "password": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
      "shell": "/bin/bash"
    },
    {
      "username": "hage",
      "groupname": ["pika"],
      "uid": 30001,
      "gid": 30100,
      "password": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
      "shell": "/bin/bash"
    }
  ]
}

ユーザー作成

以下のようにレシピを書いたったい。

$ cd itamae
$ cat cookbooks/sandbox/default.rb
#
# まずはグループ作成
#
node[:groups].each do |group|
  group "creatae group #{group}" do
    groupname group[:groupname]
    gid group[:gid]
  end
end
#
# 次にユーザー作成
#
node[:users].each do |user|
  user "create user #{user[:username]}" do
    uid user[:uid]
    gid user[:gid]
    username user[:username]
    password user[:password]
    shell user[:shell]
  end

  if user[:groupname].length > 1 then
    user[:groupname].each do |group|
      execute "add #{group}" do
        only_if "id #{user[:username]}"
        not_if "getent group #{group} | grep #{user[:username]}"
        command "usermod #{user[:username]} -aG #{group}"
      end
    end
  end
end

他にも書き方があると思うので、教えてほしかー。

適用

itamae ssh で適用するったい。
まずは --dry-run をするくさ。

$ cd itamae
$ itamae ssh -h sandbox --ssh-config=ssh_config roles/sandbox.rb --node-json sandbox.json --log-level=info --dry-run

以下のように出力されるくさ。

 INFO : Starting Itamae...
 INFO : Loading node data from /path/to/itamae/sandbox.json...
 INFO : Recipe: /path/to/itamae/roles/sandbox.rb
 INFO :   Recipe: /path/to/itamae/cookbooks/sandbox/default.rb
 INFO :     user[create user pika] exist will change from 'false' to 'true'
 INFO :     user[create user hage] exist will change from 'false' to 'true'

そして、本当に適用するくさ。

 $ cd itamae
$ itamae ssh -h sandbox --ssh-config=ssh_config roles/sandbox.rb --node-json sandbox.json --log-level=info

以下のように出力されるくさ。

 INFO : Starting Itamae...
 INFO : Loading node data from /path/to/itamae/sandbox.json...
 INFO : Recipe: /path/to/itamae/roles/sandbox.rb
 INFO :   Recipe: /path/to/itamae/cookbooks/sandbox/default.rb
 INFO :     user[create user pika] exist will change from 'false' to 'true'
 INFO :     execute[add hage] executed will change from 'false' to 'true'
 INFO :     user[create user hage] exist will change from 'false' to 'true'

Serverspec

sandbox/default_spec.rb

ユーザーがちゃんと作られているかチェックったい。

$ cd serverspec
$ cat spec/sandbox/default_spec.rb
require "spec_helper"

node_properties = open('../itamae/sandbox.json') do |io|
  JSON.load(io)
end
set_property node_properties

property["groups"].each do |group|
  describe group(group["groupname"]) do
    it { should exist }
    it { should have_gid group["gid"] }
  end
end

property["users"].each do |user|
  describe user(user["username"]) do
    it { should exist }
    it { should have_uid user["uid"].to_i }
    it { should belong_to_group user["groupname"] }
    it { should have_login_shell user["shell"] }
  end

end

itamae で使っている sandbox.json の情報を利用するったい。

チェック

$ cd serverspec
$ SSH_CONFIG_FILE=ssh_config bundle exec rake serverspec:sandbox
(省略)

Group "pika"
  should exist
  should have gid 30000

Group "hage"
  should exist
  should have gid 30100

User "pika"
  should exist
  should have uid 30000
  should belong to group "pika" and "hage"
  should have login shell "/bin/bash"

User "hage"
  should exist
  should have uid 30001
  should belong to group "pika"
  should have login shell "/bin/bash"

Finished in 7.44 seconds (files took 0.97224 seconds to load)
12 examples, 0 failures

いい感じったい。

再び、親方と見習い

見習い:おやかた〜
親方:なんや?
見習い:出来ましたー、hage ユーザーと pika ユーザー、ちゃんと hage ユーザーは hage グループと pika グループに所属させてます
親方:そげん、ハゲ、ピカ言わんと。

以上

メモでした。

元記事はこちら

ショロカレ 1 日目 | 俺の板前修業日記 〜 itamae でユーザーを複数のグループに所属させるメモ 〜