Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

global_configs - Delay evaluation until converge phase #68

Open
webframp opened this issue Dec 2, 2016 · 2 comments
Open

global_configs - Delay evaluation until converge phase #68

webframp opened this issue Dec 2, 2016 · 2 comments

Comments

@webframp
Copy link

webframp commented Dec 2, 2016

Hi there! Thanks for this cookbook.

I ran into a fun issue due to the delightful multi-phase execution model of chef figured I'd report it. I did find a workaround, but it's just slightly ugly.

The root issue is this spot in the global_configs recipe which is troublesome with a custom user: https://github.com/djoos-cookbooks/composer/blob/master/recipes/global_configs.rb#L12

When node['composer']['global_configs'] contains a user that does not yet exist, but will be created during the chef recipe, then composer::global_configs will fail with something like this beautiful message:

       ================================================================================
       Recipe Compile Error in /tmp/kitchen/cache/cookbooks/bethel_packaging/recipes/default.rb
       ================================================================================

       ArgumentError
       -------------
       user satis doesn't exist

       Cookbook Trace:
       ---------------
         /tmp/kitchen/cache/cookbooks/composer/recipes/global_configs.rb:12:in `home'
         /tmp/kitchen/cache/cookbooks/composer/recipes/global_configs.rb:12:in `block in from_file'
         /tmp/kitchen/cache/cookbooks/composer/recipes/global_configs.rb:11:in `each_pair'
         /tmp/kitchen/cache/cookbooks/composer/recipes/global_configs.rb:11:in `from_file'
         /tmp/kitchen/cache/cookbooks/composer/recipes/default.rb:11:in `from_file'
         /tmp/kitchen/cache/cookbooks/bethel_packaging/recipes/satis.rb:16:in `from_file'
         /tmp/kitchen/cache/cookbooks/bethel_packaging/recipes/default.rb:9:in `from_file'

       Relevant File Content:
       ----------------------
       /tmp/kitchen/cache/cookbooks/composer/recipes/global_configs.rb:

         5:  # Copyright (c) 2016, David Joos
         6:  #
         7:
         8:  configs = node['composer']['global_configs']
         9:
        10:  unless configs.nil?
        11:    configs.each_pair do |user, user_configs|
        12>>     user_composer_dir = "#{Dir.home(user)}/.composer"
        13:
        14:      directory user_composer_dir do
        15:        owner user
        16:        group user
        17:        mode 0755
        18:        action :create
        19:      end
        20:
        21:      user_configs.nil? && next

       Platform:
       ---------
       x86_64-linux

yuck ^

The workaround is to make your user resource (wherever it is) run during the compile phase and it looks like this:

user satis_user do
  comment 'local user for satis'
  manage_home true
  action :nothing
end.run_action(:create)

With that little method tagged onto the end of the resource it worked as intended I think. So it may be useful to do one of:

  1. Make a note in the README of this behavior
  2. Rework global_configs in some way to use a lazy eval style so it only runs during the converge phase

Hope this info is helpful in some way.

@daften
Copy link
Contributor

daften commented Apr 17, 2017

I've just worked on this, but failed miserably. The problem is that lazy is not really intended to be used in a recipe. And you can only use it for variables or attributes it seems. For environment variables like here, it doesn't seem to work: I get

           ---- Begin output of composer config --global secure-http false ----
           STDOUT:
           STDERR: /opt/chef/embedded/lib/ruby/gems/2.4.0/gems/mixlib-shellout-2.2.7/lib/mixlib/shellout/unix.rb:174:in `[]=': no implicit conversion of Chef::DelayedEvaluator into String (TypeError)
           	from /opt/chef/embedded/lib/ruby/gems/2.4.0/gems/mixlib-shellout-2.2.7/lib/mixlib/shellout/unix.rb:174:in `block in set_environment'
           	from /opt/chef/embedded/lib/ruby/gems/2.4.0/gems/mixlib-shellout-2.2.7/lib/mixlib/shellout/unix.rb:173:in `each'
           	from /opt/chef/embedded/lib/ruby/gems/2.4.0/gems/mixlib-shellout-2.2.7/lib/mixlib/shellout/unix.rb:173:in `set_environment'

ruby_block, lambda have been tried too, to no avail. I think the only way to do this properly is to rewrite some of the recipe as a resource, but that is too much work for me ATM. Feel free to open up a PR for this though :)

@daften
Copy link
Contributor

daften commented Apr 17, 2017

BTW, i've committed my work on a separate branch on my fork of this cookbook, and added the basis for tests for this as well, feel free to work from there.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants