class Awsom::SaltBootstrap

Public Class Methods

new(name, ip:, template:) click to toggle source
# File lib/awsom/salt_bootstrap.rb, line 10
def initialize(name, ip:, template:)
  @name = name
  @ip = ip
  @template = template
  validate!
end

Public Instance Methods

run() click to toggle source
# File lib/awsom/salt_bootstrap.rb, line 17
def run
  copy_bootstrap_data
  puts "running bootstrap.sh"
  run_bootstrap_sh
end

Private Instance Methods

copy_bootstrap_data() click to toggle source
# File lib/awsom/salt_bootstrap.rb, line 25
def copy_bootstrap_data
  Dir.mktmpdir("./") do |dir|
    puts "generating salt key"
    system "salt-key", "--gen-keys-dir=#{dir}", "--gen-keys=minion"

    puts "generating bootstrap script"
    erb = ERB.new(File.read @template)
    script = erb.result_with_hash({name: @name})
    File.write("#{dir}/bootstrap.sh", script)

    scp "#{dir}/minion.pem", "#{dir}/minion.pub", "#{dir}/bootstrap.sh", "root@#{@ip}:/root/"
    FileUtils.mv "#{dir}/minion.pub", "/etc/salt/pki/master/minions/#{@name}"
  end
end
pty_read(io, out) click to toggle source
# File lib/awsom/salt_bootstrap.rb, line 52
def pty_read(io, out)
  io.each { |line| out.print line }
rescue EOFError,Errno::ECONNRESET, Errno::EPIPE, Errno::EIO => e
end
run_bootstrap_sh() click to toggle source
# File lib/awsom/salt_bootstrap.rb, line 40
def run_bootstrap_sh
  FileUtils.mkdir_p "log"
  log_file = "log/#{@name}.log"
  script = 'bash /root/bootstrap.sh; rm /root/bootstrap.sh'
  r, w, pid = PTY.spawn "ssh", "-tt", *ssh_opts, "root@#{@ip}", script
  File.open log_file, "w" do |f|
    pty_read(r, f)
  end
  pid, status = Process.waitpid2(pid)
  p status
end
scp(*args, tries: 5) click to toggle source
# File lib/awsom/salt_bootstrap.rb, line 57
def scp(*args, tries: 5)
  begin
    tries = tries - 1
    system "timeout", "60", "scp", *ssh_opts, *args, exception: true
  rescue RuntimeError
    sleep 5
    retry if tries > 0
  end
end
ssh_opts(attempts = 65) click to toggle source
# File lib/awsom/salt_bootstrap.rb, line 67
def ssh_opts(attempts = 65)
  [
    "-oConnectTimeout=1",
    "-oConnectionAttempts=#{attempts}",
    "-oStrictHostKeyChecking=no",
    "-oUserKnownHostsFile=/dev/null",
    "-oBatchMode=yes"
  ]
end
validate!() click to toggle source
# File lib/awsom/salt_bootstrap.rb, line 77
def validate!
  if @name !~ /\A[a-zA-Z0-9\-\. ]+\z/
    raise "invalid name #{@name}"
  end

  if @ip !~ /\A[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+\z/
    raise "invalid ip #{@ip}"
  end
end