- 今年も
- itamaeでユーザーを複数のグループに所属させるメモ
— 親方と見習い
— 包丁の準備
—– itamaeの準備
—– Serverspecの準備
—– ということで、以下のようなディレクトリ構成にしておく
— ということで、パスワードは SHA512 でハッシュ
— sandbox.jsonにユーザーを定義
— ユーザー作成
— 適用
— Serverspec
—– sandbox/default_spec.rb
—– チェック
— 再び、親方と見習い - 以上
今年も
やって参りました、初老丸アドベントカレンダー。今年は独りぢゃないのが嬉しい。
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 グループに所属させてます
親方:そげん、ハゲ、ピカ言わんと。
以上
メモでした。