Spec-Zone.ru › Chef 17

Ресурс 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