我正在使用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
    

    最佳答案

  • 您可以将IP地址设置为output in Terraform。实际上,该链接给出了一个示例,该示例只是为了获取一个AWS实例的IP地址,在本例中为web:
    output "address" {
        value = "${aws_instance.web.public_dns}"
    }
    

    然后,您可以在使用terraform applyterraform output address之后从命令行获取此值。
  • 您可以使用config选项:sudo_password设置sudo密码。如果ec2-user无需密码即可运行sudo,请将其设置为“”。 (有关示例,请参见this blog post。)或将其传递到SUDO_PASSWORD环境变量中,如下所述:http://serverspec.org/tutorial.html
  • 关于ssh - 集成Terraform和Serverspec,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37844113/

    10-08 22:07