как запросить атрибуты внутри роли в шеф-поваре?

Я использую chef версии 10.16.2
У меня есть роль (в формате ruby). Мне нужно получить доступ к набору атрибутов в одной из поваренных книг

eg.

name "basebox"
description "A basic box with some packages, ruby and rbenv installed"

deployers = node['users']['names'].find {|k,v| v['role'] == "deploy" }

override_attributes {
  {"rbenv" => {
      "group_users" => deployers
    }
  }
}

run_list [ 
          "recipe[users]",
          "recipe[packages]",
          "recipe[nginx]",
          "recipe[ruby]"
         ]

Я использую chef-solo, поэтому я не могу использовать поиск, как указано на http://wiki.opscode.com/display/chef/Search#Search-FindNodeswithaRoleintheExpandedRunList

Как получить доступ к атрибутам узла в определении роли?


person deepak    schedule 05.12.2012    source источник


Ответы (2)


Роли — это данные JSON.

То есть, когда вы загружаете Ruby-файл ролей на сервер с помощью ножа, они конвертируются в JSON. Рассмотрим эту роль:

name "gaming-system"
description "Systems used for gaming"
run_list(
  "recipe[steam::installer]",
  "recipe[teamspeak3::client]"
)

Когда я загружаю его с помощью knife role from file gaming-system.rb, у меня на сервере это:

{
  "name": "gaming-system",
  "description": "Systems used for gaming",
  "json_class": "Chef::Role",
  "default_attributes": {
  },
  "override_attributes": {
  },
  "chef_type": "role",
  "run_list": [
    "recipe[steam::installer]",
    "recipe[teamspeak3::client]"
  ],
  "env_run_lists": {
  }
}

Причина использования Ruby DSL в том, что его "приятнее" или "легче" писать, чем JSON. Сравните строки и синтаксис, и легко увидеть, что предпочтительнее для новых пользователей (которые могут быть не знакомы с JSON).

Эти данные используются через API. Если вам нужно выполнить какую-либо логику с атрибутами на вашем узле, сделайте это в рецепте.

person jtimberman    schedule 06.12.2012
comment
но я могу искать (используя шеф-сервер) внутри роли? - person deepak; 06.12.2012
comment
Вы должны сделать это в рецепте. Ruby DSL для ролей создан для удобства. Это не место для вычислений или использования поиска. - person jtimberman; 07.12.2012

Не уверен, что я следую на 100%, но если вы хотите получить доступ к атрибуту, установленному ролью из рецепта, вы просто вызываете его, как любой другой атрибут узла. Например, в случае, который вы представили, предполагая, что узел имеет роль basebox в своем run_list, вы просто вызовете:

node['rbenv']['group_users']

Атрибуты роли объединяются в узел.

ХТН

person turtlebender    schedule 05.12.2012
comment
я пробовал это, это не работает внутри файла ролей. например, gist.github.com/4222393 я могу использовать поиск, но это работает с шеф-сервером, и я с помощью шеф-повара-соло - person deepak; 06.12.2012
comment
Я понимаю что ты имеешь ввиду. Нет, вы не можете этого сделать, потому что рубин преобразуется в json задолго до того, как он будет применен к узлу. Вам нужно будет сделать преобразование выше, используя рецепт. - person turtlebender; 06.12.2012