Spec-Zone.ru › Chef 16

Ресурс DSL

[изменить на GitHub]

Chef InSpec предоставляет механизм для определения пользовательских ресурсов. Они становятся доступными со своими соответствующими именами и обеспечивают удобную функциональность для профилей.

Расположение ресурсов

Ресурсы могут быть добавлены в профили в папке библиотек:

$ tree examples/profile
examples/profile
...
├── libraries
│   └── example_config.rb

Структура ресурса

Наименьший возможный ресурс имеет такой вид:

class Tiny < Inspec.resource(1)
  name 'tiny'
end

Ресурсы записываются как обычный класс Ruby, наследуемый от Inspec.resource. Число (1) указывает версию плагина ресурса, на которую он ориентируется. По мере развития Chef InSpec этот интерфейс может измениться и потребовать более высокую версию.

Можно настроить следующие атрибуты:

  • name - Идентификатор ресурса (обязательно)
  • desc - Описание ресурса (необязательно)
  • example - Пример использования ресурса (необязательно)
  • supports - (Chef InSpec 2.0+) Ограничения платформы для ресурса (необязательно)

Для ресурса доступны следующие методы:

  • inspec - Содержит реестр всех других ресурсов для взаимодействия с операционной системой или целевым объектом в целом.
  • skip_resource - Ресурс может вызвать этот метод, чтобы указать, что требования не выполнены. Все тесты, использующие этот ресурс, будут помечены как пропущенные.

Следующий пример демонстрирует полный ресурс, использующий атрибуты и методы для предоставления простого доступа к файлу конфигурации:

class ExampleConfig < Inspec.resource(1)
  name 'example_config'

  # Restrict to only run on the below platforms (if none were given, all OS's supported)
  supports platform_family: 'fedora'
  supports platform: 'centos', release: '6.9'
  # Supports `*` for wildcard matcher in the release
  supports platform: 'centos', release: '7.*'

  desc '
    Resource description ...
  '

  example '
    describe example_config do
      its("signal") { should eq "on" }
    end
  '

  # Load the configuration file on initialization
  def initialize(path = nil)
    @path = path || '/etc/example.conf'
    @params = SimpleConfig.new( read_content )
  end

  # Expose all parameters of the configuration file.
  def method_missing(name)
    @params[name]
  end

  private

  def read_content
    f = inspec.file(@path)
    # Test if the path exist and that it's a file
    if f.file?
      # Retrieve the file's contents
      f.content
    else
      # If the file doesn't exist, skip all tests that use example_config
      raise Inspec::Exceptions::ResourceSkipped, "Can't read config at #{@path}"
    end
  end
end

Для полного примера см. наш пример ресурса.

Ленивая загрузка

До версии InSpec v4.16 ресурсы предварительно загружались для каждого вызова inspec. Это было большой и ненужной нагрузкой на систему и ухудшало время запуска (особенно на Windows).

Начиная с InSpec v4.16, ресурсы лениво загружаются в процесс inspec при использовании. Это значительно ускоряет начальные затраты на запуск процесса inspec и загружает только то, что вам нужно использовать. Например, inspec --version больше не работает 10 секунд!

Переопределение основных ресурсов

Ленивая загрузка изменяет способ обработки реестра ресурсов таким образом, что может нарушить некоторые предположения. В частности, inspec.<resource> не заполняется предварительно основными ресурсами, поставляемыми с InSpec. Если вы создаете локальный/пользовательский ресурс с тем же именем, ссылка на основной ресурс через inspec.<resource> не будет разрешаться на основной ресурс.

Поэтому переопределение основных ресурсов не рекомендуется.

Если вам действительно нужно это сделать, проще всего создать локальный ресурс с новым именем и обратиться к основному ресурсу напрямую. В противном случае необходимо убедиться, что нужный основной ресурс зарегистрирован (через require "inspec/resource/<name>") до запуска вашего профиля, чтобы гарантировать его немедленную загрузку и включение в глобальный реестр ресурсов.

© Chef Software, Inc.
Licensed under the Creative Commons Attribution 3.0 Unported License.
The Chef™ Mark and Chef Logo are either registered trademarks/service marks or trademarks/servicemarks of Chef, in the United States and other countries and are used with Chef Inc's permission.
We are not affiliated with, endorsed or sponsored by Chef Inc.
https://docs.chef.io/inspec/dsl_resource/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API