Понимание Атрибутов Среды Повара - PullRequest
1 голос
/ 07 февраля 2020

Фон

Я пытаюсь понять, как правильно работать с атрибутами среды в рецептах. Примечание: я понимаю, что мой подход не может быть лучшей практикой шеф-повара; однако моя цель - понять поток данных здесь, а не обязательно использовать мой подход в производственном приложении.

Некоторые детали:

  1. Я использую Vagrant и Chef - в частности, провайдер chef-zero (поэтому я должен использовать файлы ruby для своей среды, а не JSON из-за ограничения шеф-повара).
  2. Вот моя структура каталогов:
├── environments
    ├── vm.rb
├── roles
    ├── base.json
├── cookbooks
    ├── init
        ├── recipes
            ├── default.rb
├── Vagrantfile

Вот мои файлы

Среда: vm.rb

name "vm"
description "Configuration file for the Kukla Demo VM"
default_attributes(
custom_demo: {
    title: 'My demo title',
    description: 'My demo description'
))

Роль: base.json

{
    "name": "base",
    "description": "Base VM configuration",
    "chef_type": "role",
    "json_class": "Chef::Role",
    "default_attributes": {},
    "override_attributes": {},
    "run_list": ["recipe[init::default]"]
}

Рецепт: default.rb

#
# Cookbook:: init
# Recipe:: default
#
# Copyright:: 2020, The Authors, All Rights Reserved.

print 'I am here!'
print node[:custom_demo]

Шеф-повар в Vagrantfile

...

chef.nodes_path = 'nodes/'
chef.environments_path = 'environments/'
chef.roles_path = 'roles/'
chef.cookbooks_path = 'cookbooks/'  

# Roles
chef.add_role "base"

...

Ожидаемое поведение

Когда я запускаю провайдера, я ожидаю увидеть custom_demo га sh, напечатанные в журнале запуска шеф-повара. Что-то вроде:

...

==> Machine: Synchronizing Cookbooks:
==> Machine: [2020-02-07T20:37:15+00:00] INFO: Storing updated cookbooks/init/recipes/default.rb in the cache.
==> Machine:
==> Machine: - init (0.1.0)
==> Machine: Installing Cookbook Gems:
==> Machine: Compiling Cookbooks...
==> Machine: I am here! custom_demo => { :title => 'My demo title', :description => 'My demo description' }
==> Machine: Converging 0 resources
==> Machine: [2020-02-07T20:37:15+00:00] INFO: Chef Infra Client Run complete in 0.118042019 seconds
...

Фактическое поведение

Вместо этого я получаю:

...

==> Machine: Synchronizing Cookbooks:
==> Machine: [2020-02-07T20:37:15+00:00] INFO: Storing updated cookbooks/init/recipes/default.rb in the cache.
==> Machine:
==> Machine: - init (0.1.0)
==> Machine: Installing Cookbook Gems:
==> Machine: Compiling Cookbooks...
==> Machine: I am here!
==> Machine: Converging 0 resources
==> Machine: [2020-02-07T20:37:15+00:00] INFO: Chef Infra Client Run complete in 0.118042019 seconds
...

Мой вопрос (ы):

На основе результата У меня остались следующие вопросы:

  1. Правильно ли мое понимание атрибутов среды (и, следовательно), мои ожидания?
  2. Если нет, то чего мне не хватает? Могут ли атрибуты среды использоваться таким образом?
  3. Как правильно отлаживать, использует ли среда повар или нет?
  4. Как правильно ссылаться на атрибуты среды в рецепт, чтобы я достиг ожидаемого результата?

1 Ответ

0 голосов
/ 08 февраля 2020

Вы все делаете правильно, и ваши ожидания верны. Единственное, что вам не хватает, это то, что вы не назначаете среду для vm. Для этого вам нужно добавить строку в Vagrantfile:

...

chef.nodes_path = 'nodes/'
chef.environments_path = 'environments/'
chef.roles_path = 'roles/'
chef.cookbooks_path = 'cookbooks/'
chef.environment = 'vm' # the added line  

# Roles
chef.add_role "base"

...

Чтобы понять, что если для узла выбрана правильная среда, вы можете просто распечатать в своем рецепте:

p node.chef_environment
# or
p node.environment

Что касается вашего последнего вопроса, вы на самом деле не можете ссылаться на атрибуты среды рецепта. Chef собирает атрибуты из разных источников (рецепт, среда, узел и т. Д. c.) И объединяет их в 1 атрибут ha sh , используя приоритет , поэтому в конце вы можете ссылаться только на атрибут с наивысшим приоритетом. или с некоторым конкретным приоритетом, но не источником атрибута (окружение, узел или рецепт).

node[:custom_demo] # highest precedence
node.default[:custom_demo] # default precedence, ignoring override and normal
...