chef-infrachef-attributes

Chef attributes file


I have a chef recipe written for creating three users, adding them to a group and writing them to a sudoers file.

group "usergroup" do
  gid 2000
end

print "User1 or User2 or User3?"
env=$stdin.gets.chomp
case env
when "User1"
  user "User1" do
    uid 150
    gid "usergroup"
    home "/home/User1"
    shell "/bin/bash"
  end

  directory "/home/User1" do
    owner "User1"
    group "usergroup"
    mode "0777"
    action :create
  end

  execute "echo" do
    command "echo 'User1 ALL=(ALL) ALL' >> /etc/sudoers"
    not_if "grep -F 'User1 ALL=(ALL) ALL' /etc/sudoers"
  end

when "User2"
  user "User2" do
    uid 250
    gid "usergroup"
    home "/home/User2"
    shell "/bin/bash"
  end

  directory "/home/User2" do
    owner "User2"
    group "usergroup"
    mode "0777"
    action :create
  end

  execute "echo" do
    command "echo 'User2 ALL=(ALL) ALL' >> /etc/sudoers"
    not_if "grep -F 'User2 ALL=(ALL) ALL' /etc/sudoers"
  end

when "User3"
  user "User3" do
    uid 350
    gid "usergroup"
    home "/home/User3"
    shell "/bin/bash"
  end

  directory "/home/User3" do
    owner "User3"
    group "usergroup"
    mode "0777"
    action :create
  end

  execute "echo" do
    command "echo 'User3 ALL=(ALL) ALL' >> /etc/sudoers"
    not_if "grep -F 'User3 ALL=(ALL) ALL' /etc/sudoers"
  end
end

I am brand new to Chef, and I need some help in writing a suitable attribute file for this recipe(/cookbook/User/attributes/default.rb). I have tried everything I know, but nothing is working out for me. Also I would like to know if the case statements can be included in the attribute file.

Note: I am running Chef in local mode.


Solution

  • in attributes/default.rb:

    default['myusers'] = ['user1','user2','user3']
    default['mygroup'] = "usergroup" 
    default['myenv'] = 2 #no quotes to keep an integer
    

    in recipe/default.rb:

    group node['mygroup'] do
      gid 2000
    end
    
    currentUser = node['myusers'][node['myenv'] - 1] #arrays start at 0, doing -1 for 2 pointing to second user
    user currentUser do
      gid node['mygroup']
      home "/home/#{currentUser}"
    end
    execute "sudoers for #{currentUser}" do
      command "echo '#{currentUser} ALL=(ALL) ALL' >> /etc/sudoers"
      not_if "grep -F '#{currentUser} ALL=(ALL) ALL' /etc/sudoers"
    end
    

    You may take advantage of the sudoers cookbook which can manage that for you, but sticking to your requirements.