我正在使用Terraform自动构建基于AWS EC2的docker主机,然后使用其远程exec选项下载docker文件,构建并运行它。
我希望将它与Serverspec集成,但我正在努力解决两件事:
将新创建的AWS EC2实例的外部dns传递给Serverspec的最佳方法。
如何为Serverspec配置SSH选项,以便使用ec2-user帐户在Amazon Linux AMI上正确执行。
我通常使用预定义的密钥对连接到EC2实例,并且从不使用密码,但ServerSpec似乎在服务器上以sudo -p格式运行命令。
任何建议都非常感谢。
spec_helper.rb的内容
require 'serverspec'
require 'net/ssh'
set :ssh_options, :user => 'ec2-user'
同样使用编辑的rakefile如下强制正确的EC2外部dns(蒙面):
require 'rake'
require 'rspec/core/rake_task'
hosts = %w(
ec2-nn-nn-nn-nnn.eu-west-1.compute.amazonaws.com
)
set :ssh_options, :user => 'ec2-user'
task :spec => 'spec:all'
namespace :spec do
task :all => hosts.map {|h| 'spec:' + h.split('.')[0] }
hosts.each do |host|
short_name = host.split('.')[0]
role = short_name.match(/[^0-9]+/)[0]
desc "Run serverspec to #{host}"
RSpec::Core::RakeTask.new(short_name) do |t|
ENV['TARGET_HOST'] = host
t.pattern = "spec/Nexus/*_spec.rb"
end
end
end
答案 0 :(得分:1)
您可以将IP地址设为output in Terraform。实际上,该链接提供了一个示例,用于获取AWS实例的IP地址,在这种情况下名为angular.module('myApp').controller('AppController',['$scope','ItemsFactory',
function($scope,ItemsFactory){
ItemsFactory.getItems().then(function (data) {
$scope.items = data;
});
}]);
:
web
然后,您可以在output "address" {
value = "${aws_instance.web.public_dns}"
}
terraform apply
后的命令行中获取此值。
您可以使用config选项设置sudo密码:sudo_password。如果ec2用户可以在没有密码的情况下运行sudo,请将其设置为''。 (有关示例,请参阅this blog post。)或者在SUDO_PASSWORD环境变量中传递它,如下所述:http://serverspec.org/tutorial.html