【问题标题】:Alternate drivers with test-kitchen带测试厨房的备用驱动程序
【发布时间】:2015-07-16 11:28:53
【问题描述】:
许多食谱,例如 mysql cookbook 有多个 .kitchen.yml 文件。例如,mysql 有一个 .kitchen.yml 和一个 .kitchen-cloud.yml。查看测试厨房的文档和代码,除了.kitchen.yml、.kitchen.local.yml 和~/.kitchen/config.yml,我看不到任何使用配置文件的方法。如果我想使用 mysql 食谱中的云驱动程序,我会:
cp .kitchen-cloud.yml .kitchen.yml
cp .kitchen-cloud.yml .kitchen.local.yml
- 还有别的吗??
似乎应该有一种更简洁的方法来使用替代配置文件,即强力替换默认配置文件。
谢谢
【问题讨论】:
标签:
chef-infra
test-kitchen
【解决方案1】:
Kitchen 提供了三个环境变量来控制它在哪里查找每个可能的配置文件。要明确默认行为,您可以按如下方式设置它们:
KITCHEN_YAML="./.kitchen.yml"
KITCHEN_LOCAL_YAML="./.kitchen.local.yml"
KITCHEN_GLOBAL_YAML="$HOME/.kitchen/config.yml"
您不需要覆盖所有这些,因此您可以使用 .kitchen-cloud.yml 运行 test-kitchen,如下所示:
$ KITCHEN_YAML=".kitchen-cloud.yml" kitchen test
【解决方案2】:
... 添加到 coderanger,如果你想根据你的 CI 工具是否设置环境变量来选择驱动程序或选项,你也可以这样做:
---
<%
#--------------------------------------------------------------------------
# the driver_plugin can be overridden with an environment variable:
# $ KITCHEN_DRIVER=docker kitchen test
# if not specified, defaults are used...
# - kitchen_driver_ci if environment variable CI=true or TRAVIS=true are present
# - kitchen_driver_local is used otherwise (which defaults to vagrant)
#--------------------------------------------------------------------------
kitchen_driver_ci = 'ec2'
kitchen_driver_local = 'vagrant'
kitchen_driver_default = kitchen_driver_local
if ENV['KITCHEN_DRIVER']
kitchen_driver = ENV['KITCHEN_DRIVER']
elsif ENV['TRAVIS']=="true"
kitchen_driver = kitchen_driver_ci
elsif ENV['CI']=="true"
kitchen_driver = kitchen_driver_ci
else
kitchen_driver = kitchen_driver_default
end
puts "-----> driver_plugin: #{kitchen_driver.to_s}"
%>
driver_plugin: <%= kitchen_driver %>
driver_config:
require_chef_omnibus: 11.10.4
<% if kitchen_driver == 'ec2' %>
aws_access_key_id: <%= ENV['AWS_ACCESS_KEY_ID'] %>
aws_secret_access_key: <%= ENV['AWS_SECRET_ACCESS_KEY'] %>
aws_ssh_key_id: <%= ENV['AWS_SSH_KEY_ID'] || "test-kitchen" %>
ssh_key: <%= ENV['AWS_SSH_KEY_FILE'] || "./test-kitchen.pem" %>
region: <%= ENV['AWS_REGION'] || "us-east-1" %>
availability_zone: <%= ENV['AWS_AVAILABILITY_ZONE'] || "us-east-1c" %>
flavor_id: "t2.small"
groups: ["test-kitchen"]
<% end %>
<% if kitchen_driver == 'vagrant' %>
customize:
memory: 2048
<% end %>
platforms:
- name: ubuntu-14.04
<% if kitchen_driver == 'ec2' %>
driver_config:
image_id: ami-6ab2a702
username: ubuntu
tags: { "Name": "Test Kitchen" }
<% end %>
busser:
sudo: true
suites:
- name: default
run_list: [
]
attributes: {
}
通过这种方式,您可以维护单个文件并避免不同的平台测试(在一个文件中进行更改而忘记在另一个文件中进行更改)。在某些情况下,.kitchen.local.yml 中提供的选项可能与 .kitchen.yml 中的选项冲突。
【解决方案3】:
除了zts所说的,记住你可以在厨房文件中使用ERb,所以你的驱动配置可以是这样的:
driver:
name: <%= ENV['KITCHEN_DRIVER'] || 'vagrant' %>
【解决方案4】:
我在寻找使用一个厨房文件支持多个驱动程序的解决方案时发现了这个问题,Ives 的回答非常有帮助。我对其进行了调整以执行以下操作。
- 默认为 vagrant 驱动程序
- 允许用户使用 KITCHEN_DRIVER 环境变量覆盖驱动程序设置
- 如果已安装 docker_ssh 驱动程序,请选择它。
---
<%
require 'rubygems'
kitchen_driver = 'vagrant'
if ENV['KITCHEN_DRIVER']
kitchen_driver = ENV['KITCHEN_DRIVER']
elsif Gem::Specification::find_all_by_name('kitchen-docker_ssh').any?
kitchen_driver = 'docker_ssh'
end
%>
driver:
name: <%= kitchen_driver %>