集成Terraform和Serverspec

时间:2016-06-15 19:24:57

标签: ssh amazon-ec2 terraform serverspec

我正在使用Terraform自动构建基于AWS EC2的docker主机,然后使用其远程exec选项下载docker文件,构建并运行它。

我希望将它与Serverspec集成,但我正在努力解决两件事:

  1. 将新创建的AWS EC2实例的外部dns传递给Serverspec的最佳方法。

  2. 如何为Serverspec配置SSH选项,以便使用ec2-user帐户在Amazon Linux AMI上正确执行。

  3. 我通常使用预定义的密钥对连接到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
    

1 个答案:

答案 0 :(得分:1)

  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后的命令行中获取此值。

  2. 您可以使用config选项设置sudo密码:sudo_password。如果ec2用户可以在没有密码的情况下运行sudo,请将其设置为''。 (有关示例,请参阅this blog post。)或者在SUDO_PASSWORD环境变量中传递它,如下所述:http://serverspec.org/tutorial.html