Переменное количество свойств, отправляемых на ресурс Chef в зависимости от кода рецепта - PullRequest
1 голос
/ 01 апреля 2020

Я хочу передать переменное количество свойств ресурсу на основе значений, доступных в атрибутах.

Вот идея того, что я хочу сделать. Если мне нужна логика if c вокруг свойств, я не уверен, возможно ли сделать что-то подобное ...

rpms = [ 
  {
    "name": "name",
    "version": "version",
    "release": "release",
    "arch": "arch"
  },
  {
    "name": "name"
  }
]

rpms.each do | package_info |
  custom_package 'install' + package_info['name'] do
    name package_info['name']
    if defined?(package_info['version'])  # Only pass that property if it is available
      version package_info['version']
    end
    if defined?(package_info['release'])  # Only pass that property if it is available
      version package_info['release']
    end
    if defined?(package_info['arch'])  # Only pass that property if it is available
      version package_info['arch']
    end
  end
end

Есть ли что-то подобное в Chef?

1 Ответ

1 голос
/ 02 апреля 2020

Вы можете сделать это, используя Ruby send метод , который вызывает метод, идентифицируемый первым аргументом, передавая ему любые другие указанные аргументы.

rpms = [ 
  {
    "name": "name",
    "version": "version",
    "release": "release",
    "arch": "arch"
  },
  {
    "name": "name"
  }
]

rpms.each do |package_info|
  custom_package "install ${package_info['name']}" do
    package_info.each do |key, value|
      send(key, value)
    end
  end
end
...