Chef kithen проверка рецептов

Идеальная проверка, подробности каждого шага ниже:

foodcritic .

cookstyle .

chef exec rspec .

kitchen test

Есть автоматические способы проверить синтаксис и  исправить ошибки в коде

Проверка синтаксиса файлов:

foodcritic .

и

cookstyle .

Можно применить автокоррекцию:

cookstyle -a .

Встроенные тесты:

Тут мы можем найти unit тесты:

spec/unit/recipes/default_spec.rb

Пример

require 'spec_helper'

describe 'custom_apache::default' do
  context 'When all attributes are default, on an unspecified platform' do
    let(:chef_run) do
      runner = ChefSpec::ServerRunner.new
      runner.converge(described_recipe)
    end

    it 'converges successfully' do
      chef_run # This should not raise an error
    end

    it 'creates the default web site' do
      expect(chef_run).to create_custom_apache_site 'my_site'
    end

    it 'configures web content ownership' do
      expect(chef_run).to create_file('/var/www/html/index.html').with(
        owner: 'alice',
        group: 'www-content',
        mode: 0644
      )
      expect(chef_run).to create_directory('/var/www/html').with(
        owner: 'alice',
        group: 'www-content',
        mode: 0755
      )
    end
  end
end

Запускается так

chef exec rspec .

InSpec tests

Служит для проверки, как работают сложные функции вместе.

Тесты должны находиться тут

test/integration/default

Если их нет, надо их создать

# # encoding: utf-8

# Inspec test for recipe custom_apache::default

# The Inspec reference, with examples and extensive documentation, can be
# found at http://inspec.io/docs/reference/resources/

%w( libapache2-modsecurity libapache2-mod-spamhaus ).each do |package_name|
  describe package(package_name) do
    it { should be_installed }
  end
end

describe group('www-content') do
  it { should exist }
end

describe user('alice') do
  it { should exist }
  its('group') { should eq 'www-content' }
  its('home') { should eq '/home/alice' }
  its('shell') { should eq '/bin/bash' }
end

describe package('apache2') do
  it { should be_installed }
end

describe service('apache2') do
  it { should be_enabled }
  it { should be_running }
end

describe file('/var/www/html/index.html') do
  it { should be_file }
  it { should be_owned_by 'alice' }
  it { should be_grouped_into 'www-content' }
  its('mode') { should cmp '0644' }
end

describe file('/var/www/html') do
  it { should be_directory }
  it { should be_owned_by 'alice' }
  it { should be_grouped_into 'www-content' }
  its('mode') { should cmp '0755' }
end

describe port(80) do
  it { should be_listening }
end

Надо добавить строку для того чтобы провека запустилась в файл .kitchen.yml

verifier:
  name: inspec

Запуск:

kitchen verify

kitchen verify так же создает инстанс (kitchen create) и запускает chef-client (kitchen converge)если виртуалки не существует

Более сложная проверка на виртуальной машине, когда мы проверили код , перед выходом продакшн:

Для проверки нужен VirtualBox and Vargant

После генерации рецепта создается в корне рецепта файл .kitchen.yml

---
driver:
  name: vagrant

provisioner:
  name: chef_zero
  # You may wish to disable always updating cookbooks in CI or other testing environments.
  # For example:
  #   always_update_cookbooks: <%= !ENV['CI'] %>
  always_update_cookbooks: false

verifier:
  name: inspec

platforms:
  - name: ubuntu-16.10

suites:
  - name: default
    run_list:
      - recipe[learn_chef_apache2::default]
    verifier:
      inspec_tests:
        - test/smoke/default
    attributes:

Управление kitchen

Вывести список виртуалок и их статус

kitchen list

Создать виртуалку

kitchen create

Запустить chef-client на виртулке

kitchen converge

Вывести полное описание

kitchen diagnose --all

Удалить виртуалку

kitchen destroy

Выполнить команду на виртуалке

kitchen exec -c 'wget -qO- localhost'

Если надо использовать личные данные для проверки, то их можно вынести в отдельный файл или использовать переменные

.kitchen.local.yml
---
driver:
  aws_ssh_key_id: learnchef
  region: us-west-2
  availability_zone: a
  subnet_id: subnet-eacb348f
  image_id: ami-c3b3b1f3
  security_group_ids: ['sg-2d3b3b48']

transport:
  ssh_key: C:\Users\LearnChef\.ssh\learnchef.pem

 

---
driver:
  name: ec2
  aws_ssh_key_id: <%= ENV['AWS_SSH_KEY_ID'] %>
  region: <%= ENV['AWS_REGION'] %>
  availability_zone: <%= ENV['AWS_AZ'] %>
  subnet_id: <%= ENV['AWS_SUBNET_ID'] %>
  instance_type: m1.small
  image_id: <%= ENV['AWS_AMI_ID'] %>
  security_group_ids: <%= ENV['AWS_SECURITY_GROUP_IDS'] %>
  retryable_tries: 120

provisioner:
  name: chef_zero

verifier:
  name: inspec

transport:
  ssh_key: <%= ENV['AWS_SSH_KEY_PATH'] %>

platforms:
  - name: windows-2012r2

suites:
  - name: default
    run_list:
      - recipe[example_cookbook::default]
    attributes:

 

Chef

Related Articles

0 Comment

Leave a Comment

Ваш адрес email не будет опубликован.