Example: User Management
User Management
Manage system users, groups, SSH authorized keys, sudoers configuration, and home directory setup.
Directory Structure
cookbooks/
users/
default.rb
templates/
sudoers.erb
nodes/
base.json
Node Attributes
{
"users": {
"admins": [
{
"name": "alice",
"uid": 2001,
"shell": "/bin/bash",
"ssh_key": "ssh-ed25519 AAAA... alice@example.com"
},
{
"name": "bob",
"uid": 2002,
"shell": "/bin/zsh",
"ssh_key": "ssh-ed25519 AAAA... bob@example.com"
}
],
"deployers": [
{
"name": "deploy",
"uid": 3001,
"shell": "/bin/bash"
}
],
"admin_group_gid": 2000,
"deploy_group_gid": 3000
}
}
Recipe
# cookbooks/users/default.rb
group 'admins' do
gid node['users']['admin_group_gid']
end
group 'deployers' do
gid node['users']['deploy_group_gid']
end
node['users']['admins'].each do |admin|
user admin['name'] do
uid admin['uid']
gid node['users']['admin_group_gid']
home "/home/#{admin['name']}"
shell admin['shell']
create_home true
end
directory "/home/#{admin['name']}/.ssh" do
owner admin['name']
group admin['name']
mode '0700'
end
file "/home/#{admin['name']}/.ssh/authorized_keys" do
content admin['ssh_key']
owner admin['name']
group admin['name']
mode '0600'
end
end
node['users']['deployers'].each do |deployer|
user deployer['name'] do
uid deployer['uid']
gid node['users']['deploy_group_gid']
home "/home/#{deployer['name']}"
shell deployer['shell']
create_home true
end
directory "/home/#{deployer['name']}/.ssh" do
owner deployer['name']
group deployer['name']
mode '0700'
end
end
template '/etc/sudoers.d/admins' do
source 'templates/sudoers.erb'
owner 'root'
group 'root'
mode '0440'
variables(
admin_group: 'admins'
)
end
execute 'validate-sudoers' do
command 'visudo -cf /etc/sudoers.d/admins'
only_if 'test -f /etc/sudoers.d/admins'
end
Templates
sudoers.erb
# Managed by Itamae
%<%= @admin_group %> ALL=(ALL:ALL) NOPASSWD:ALL
Running
itamae ssh -j nodes/base.json -h server01.example.com cookbooks/users/default.rb