2016-06-15 10 views
1

私はTerraformを使用してAWS EC2ベースのドッカーホストの構築を自動化し、リモートのexecオプションを使用してドッカーファイルをダウンロードし、ビルドして実行しています。TerraformとServerspecの統合

私はServerspecでこれを統合することを望んだと思いますが、2つの物事をうまくするために苦労しています:

  1. Serverspecに新しく作成されたAWS EC2インスタンスの外部DNSを渡すための最良の方法を。

  2. ec2-userアカウントを使用してAmazon Linux AMIで正しく実行されるように、ServerspecのSSHオプションを構成する方法。

私は通常、事前定義されたキーのペアを使用してEC2インスタンスに接続し、パスワードを使用しないだろうがしかしServerSpecはsudoの-pのフォーマットをもつサーバー上でコマンドを実行しているようです。

アドバイスをいただければ幸いです。 spec_helper.rbの

内容も(マスク)正しいEC2外部DNSを強制するために、次のように編集したrakefileを使用して

require 'serverspec' 
require 'net/ssh' 

set :ssh_options, :user => 'ec2-user' 

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

。呼び出す方がはるかに簡単です。しかし、私の使用事例では、他のトレードオフがあると確信しています。 – user1229364

答えて

1
  1. あなたはIPアドレスoutput in Terraform作ることができます。実際には、リンクは、この場合にはwebという名前のAWSインスタンスのIPアドレスを取得するだけでそれを行う例を示します:

    output "address" { 
        value = "${aws_instance.web.public_dns}" 
    } 
    

    次にあなたがterraform output addressterraform apply後、コマンドラインからこの値を取得することができます。

  2. sudoのパスワードは、configオプション:sudo_passwordで設定できます。 ec2ユーザーがパスワードなしでsudoを実行できる場合は、これを ''に設定します。 (例えばthis blog postを参照)またはSUDO_PASSWORD環境変数に渡し、ここで説明:私はシェフのINSPECとサーバーのスペックを交換するより多くの成功を持っていたhttp://serverspec.org/tutorial.html

+0

ご協力ありがとうございます。私はrakefileとspec_helper.rbに必要な正確な内容を、Net:SSHユーザーをec2ユーザーに設定している単一のホストの簡単なテストのために、まだ解決しようとしています。 – user1229364

+0

行セットssh_options、:user => 'ec2-user'をいずれかのファイルに追加しても機能しません。それはまだ私のMACユーザー名を使用してEC2ホストに接続しようとします。 – user1229364

+0

spec_helper.rbの内容を投稿に追加できますか? –