Ошибка компиляции рецепта шеф-повара

Я пытаюсь создать рецепт шеф-повара, который зависит от tomcat поваренной книги, такой как

tomcat_user = node[:tomcat][:user]
tomcat_user_home_folder = node[:etc][:passwd][tomcat_user][:dir]
execute "Install jasper license" do
    command "cp jasperserver.license #{tomcat_user_home_folder}/"
    cwd "#{node["install-jasper-license"]["license-location"]}"
end

Когда я запускаю sudo chef-client на узле, я получаю следующую ошибку:

================================================================================
Recipe Compile Error in /var/chef/cache/cookbooks/install-jasper-license/recipes/default.rb
================================================================================

NoMethodError
-------------
undefined method `[]' for nil:NilClass

На мой взгляд, этот рецепт не может найти node[:etc][:passwd][tomcat_user]. Пользователь tomcat будет установлен при запуске рецепта tomcat. Я также добавил depends 'tomcat' в metadata.rb этой кулинарной книги. Моя цель здесь - установить файл в домашнем местоположении пользователя, работающего с tomcat. Как мне это сделать?


person Vaibhav    schedule 16.12.2013    source источник


Ответы (1)


Источником вашей проблемы является то, что пользователь tomcat создается после того, как вы прочитали для него значение, которое будет установлено OHAI.

Чтобы решить эту проблему, вам необходимо выполнить 2 шага:

  1. Вы должны перезагрузить данные OHAI после создания пользователя, чтобы у вас был доступ к данным. Обычно данные OHAI (в node["etc"]) обновляются только один раз во время одной из первых фаз запуска Chef.
  2. Вы должны адаптировать свой рецепт так, чтобы данные учетной записи считывались только после их обновления.

Вы можете реорганизовать свой код следующим образом:

########################################################################
# 1. Reload OHAI data if required
ohai "reload_passwd" do
  action :nothing
  plugin "passwd"
end

# Make the installation of the tomcat package notify the reload of the OHAI data
# This works for all the Linux's but not SmartOS
tomcat_package = resources(:package => "tomcat#{node["tomcat"]["base_version"]}")
tomcat_package.notifies :reload, "ohai[reload_passwd]", :immediately

########################################################################
# 2. Install license file

ruby_block "Install jasper license" do
  block do
    tomcat_user = node["tomcat"]["user"]
    tomcat_user_home_folder = node["etc"]["passwd"][tomcat_user]["dir"]

    File.copy File.join(node["install-jasper-license"]["license-location"], "jasperserver.license"), File.join(tomcat_user_home_folder, "jasperserver.license")
  end
  not_if{ File.exist? File.join(tomcat_user_home_folder, "jasperserver.license") }
end

ruby_block гарантирует, что вы читаете данные только на этапе преобразования после обновления данных OHAI.

person Holger Just    schedule 16.12.2013
comment
Можно ли решить эту проблему с помощью ленивой оценки атрибутов? docs.opscode.com/resource_common.html#lazy-attribute-evaluation - person Draco Ater; 17.12.2013
comment
Вы также можете использовать ленивую оценку в execute или ruby_block. Вам все равно нужно будет перезагрузить ohai, чтобы у вас был доступ к информации о пользователе. - person Holger Just; 18.12.2013