class Sunzi::Command
Public Instance Methods
compile(role = nil)
click to toggle source
# File lib/sunzi/command.rb, line 60 def compile(role = nil) abort_with 'You must be in a sunzi folder' unless File.exist?('sunzi.yml') abort_with "#{role} doesn't exist!" if role && !File.exist?("roles/#{role}.sh") abort_with 'As of v2, "attributes" are now "vars" in sunzi.yml and shell scripts.' if config.attributes # Retrieve remote recipes via HTTP (config.recipes || []).each do |key, value| dest = "compiled/recipes/#{key}.sh" next if config.preferences.cache_remote_recipes && File.exist?(dest) get value, dest end @vars = config.vars # Used within ERB templates # Copy local files to compiled folder files = glob('{recipes,roles,files}/**/*').select { |file| File.file?(file) } files.each do |file| render file, "compiled/#{file}" end # Copy files specified in sunzi.yml (config.files || []).each do |file| render file, "compiled/files/#{File.basename(file)}" end # Build install.sh render 'install.sh', 'compiled/install.sh' # Append role at the bottom of install.sh if role append_to_file 'compiled/install.sh', "\n" + File.read("compiled/roles/#{role}.sh") end end
create(project)
click to toggle source
# File lib/sunzi/command.rb, line 10 def create(project) copy_file 'templates/create/.gitignore', "#{project}/.gitignore" copy_file 'templates/create/sunzi.yml', "#{project}/sunzi.yml" copy_file 'templates/create/install.sh', "#{project}/install.sh" copy_file 'templates/create/recipes/sunzi.sh', "#{project}/recipes/sunzi.sh" copy_file 'templates/create/roles/db.sh', "#{project}/roles/db.sh" copy_file 'templates/create/roles/web.sh', "#{project}/roles/web.sh" copy_file 'templates/create/files/.gitkeep', "#{project}/files/.gitkeep" end
deploy(target, role, options)
click to toggle source
# File lib/sunzi/command.rb, line 20 def deploy(target, role, options) # compile vars and recipes compile(role) sudo = 'sudo ' if options.sudo? endpoint = Endpoint.new(target) # The host key might change when we instantiate a new VM, so # we remove (-R) the old host key from known_hosts. `ssh-keygen -R #{endpoint.host} 2> /dev/null` remote_commands = <<-EOS rm -rf ~/sunzi && mkdir ~/sunzi && cd ~/sunzi && tar xz && #{sudo}bash install.sh EOS remote_commands.strip! << ' && rm -rf ~/sunzi' if config.preferences.erase_remote_folder local_commands = <<-EOS cd compiled tar cz . | ssh -o 'StrictHostKeyChecking no' #{endpoint.user}@#{endpoint.host} -p #{endpoint.port} '#{remote_commands}' EOS Open3.popen3(local_commands) do |stdin, stdout, stderr| stdin.close t = Thread.new do while (line = stderr.gets) print line.color(:red) end end while (line = stdout.gets) print line.color(:green) end t.join end end
Private Instance Methods
config()
click to toggle source
# File lib/sunzi/command.rb, line 97 def config @config ||= YAML.load(ERB.new(File.read('sunzi.yml')).result).to_hashugar end
glob(pattern)
click to toggle source
# File lib/sunzi/command.rb, line 107 def glob(pattern) Dir.glob(pattern, File::FNM_DOTMATCH) - ['.', '..'] end
render(source, target)
click to toggle source
template method requires absolute path to work with current directory
# File lib/sunzi/command.rb, line 103 def render(source, target) template File.expand_path(source), target, context: binding end