[chef] Re: Re: Re: Creating authorized_keys for LDAP users.


Chronological Thread 
  • From: Noah Kantrowitz < >
  • To:
  • Subject: [chef] Re: Re: Re: Creating authorized_keys for LDAP users.
  • Date: Mon, 26 Jan 2015 15:52:44 -0800

Chef and Ohai use the Etc library in Ruby, which in turn uses the standard 
getpw* and getgr* calls. These are configured by nsswitch.conf. If you go 
look this up, you'll see that that file is only read once for a given process 
and there is no universal way to clear the config. Some libcs offer 
non-standard calls for it, but I doubt any of those are exposed to Ruby.

--Noah

On Jan 26, 2015, at 3:29 PM, Douglas Garstang 
< >
 wrote:

> Sorry to have to repeat myself, but I can't use 'owner' and 'group' on 
> resources. Even thought LDAP is configured, chef isn't able to see the 
> users and groups.
> 
> David suggested I reload ohai. I had no idea this was necessary or 
> required, but I tried it anyway. I put this at the end of my ldap cookbook.
> 
> ohai "reload_passwd" do
>   plugin "etc"
> end
> log node['etc']['passwd']
> 
> What I am seeing, (I'm using vagrant), is that on the first chef run, the 
> LDAP users are not in in the node structure. However, if I reprovision, 
> (without making any changes), then the users ARE there.
> 
> In hindsight, isn't this just the typical node[] not being populated until 
> after the chef run issue?
> 
> Doug.
> 
> On Mon, Jan 26, 2015 at 3:22 PM, Lamont Granquist 
> < >
>  wrote:
> On 1/26/15 2:29 PM, Douglas Garstang wrote:
>> I'm having trouble setting up users authorized keys. A cookbook that runs 
>> earlier in the runlist sets up LDAP. However, due to reasons I don't 
>> understand, none of that user information is available during the chef 
>> run. I previously posted about this once before. As a result, I can't 
>> simply create files and directories and use 'owner' and 'group.
>
>> I came up with the below idea. I'm iterating over the ssh keys in a data 
>> bag and then for each user running a command as this user. That makes PAM 
>> do all the home directory setup for me. I create the ~/.ssh directory in a 
>> similar fashion, as the user. All works ok. However, I'm having an issue 
>> with adding the array of ssh_keys pulled from the data bag to the users 
>> authorized keys file. 
>
>> include_recipe "slice-ldap"
>> bag = data_bag("ssh-keys")
>> for item in bag do
>>   user = data_bag_item('ssh-keys', item)
>>   user_name = user['id']
>>   ssh_keys = user['ssh_keys']
>>   execute "create_home_#{user_name}" do
>>     command "su - #{user_name} -c \"ls\""
>>     creates "/home/#{user_name}"
>>     notifies :run, "execute[create_ssh_dir_#{user_name}]", :immediately
>>   end
>>   execute "create_ssh_dir_#{user_name}" do
>>     command "su - #{user_name} -c \"mkdir /home/#{user_name}/.ssh\""
>>     notifies :run, "execute[install_public_rsa_#{user_name}]", :immediately
>>     creates "/home/#{user_name}/.ssh"
>>   end
>>   ssh_keys.each_with_index do |k, index|
>>     log "k = #{k}"
>>     execute "install_public_rsa_#{user_name}" do
>>       command "su - #{user_name} -c \"echo '#{k}' >> 
>> /home/#{user_name}/.ssh/authorized_keys\""
>>       action :nothing
>>     end
>>   end
>> end
>
>> However, I'm having an issue with adding the array of ssh_keys pulled from 
>> the data bag to the users authorized keys file. The loop at the end does 
>> this, but chef also gives me this warning:
>
>> ==> default: [2015-01-26T22:23:47+00:00] WARN: Previous 
>> execute[install_public_rsa_doug]: 
>> /tmp/vagrant-chef-3/chef-solo-1/cookbooks/slice-ssh-keys/recipes/default.rb:38:in
>>  `block (2 levels) in from_file'
>> ==> default: [2015-01-26T22:23:47+00:00] WARN: Current  
>> execute[install_public_rsa_doug]: 
>> /tmp/vagrant-chef-3/chef-solo-1/cookbooks/slice-ssh-keys/recipes/default.rb:38:in
>>  `block (2 levels) in from_file'
>
>
>> Apart from the warning, only the last ssh keys is being added to the 
>> authorized_keys file. Even though I'm using echo and >>, the last one is 
>> not there. The log statement shows each key, so I know the loop is 
>> iterating over both. What gives?
>
>> Doug
>
> Yeah the warning is trying to tell you the problem.  You're defining 
> multiple resources called `execute[install_public_rsa_doug]` and the 
> resource collection and the way notifies and subscribes is implemented 
> requires unique names.  So you're getting resource cloning and you're only 
> notifying one of those blocks.  You could add the index to then name and 
> then subscribe to the previous resources:
> 
>   ssh_keys.each_with_index do |k, index|
>     log "k = #{k}"
>     execute "install_public_rsa_#{user_name}_#{index}" do
>       command "su - #{user_name} -c \"echo '#{k}' >> 
> /home/#{user_name}/.ssh/authorized_keys\""
>       subscribes :run, "execute[#{create_ssh_dir_#{user_name}]"
>       subscribes :run, "execute[#{create_home_#{user_name}]"
>       action :nothing
>     end
>   end
> 
> You'll be way better off just doing this though:
> 
> file "/home/#{user_name}" do
>   owner user_name
>   group user_name  # or "users" or whatever
>   mode "0600"
> end
> 
> file "/home/#{user_name}/.ssh" do
>   owner user_name
>   group user_name
>   mode "0600" 
> end
> 
> file "/home/#{user_name}/.ssh/authorized_keys" do
>   owner user_name
>   group user_name 
>   mode "0600"
>   content ssh_keys.join("\n")
> end
> 
> That's idempotent, you don't need the action :nothing or any notifications 
> or subscriptions, you can push new keys out and it'll correctly update, 
> gets the job done with fewer resources, etc.  Similarly executing to su is 
> a huge antipattern, so you can replace the rest of that.
> 
> 
> 
> 
> -- 
> Regards,
> 
> Douglas Garstang
> http://www.linkedin.com/in/garstang
> Email: 
> 
> Cell: +1-805-340-5627

Attachment: signature.asc
Description: Message signed with OpenPGP using GPGMail




Archive powered by MHonArc 2.6.16.

§