summaryrefslogtreecommitdiff
path: root/lib/leap_cli/commands/deploy.rb
blob: 84c78461697df4b60935cc34ed733e7e0d41daf8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
module LeapCli
  module Commands

    desc 'Apply recipes to a node or set of nodes'
    long_desc 'The node filter can be the name of a node, service, or tag.'
    arg_name '<node filter>'
    command :deploy do |c|
      c.action do |global_options,options,args|
        init_submodules

        nodes = manager.filter!(args)
        if nodes.size > 1
          say "Deploying to these nodes: #{nodes.keys.join(', ')}"
          unless agree "Continue? "
            quit! "OK. Bye."
          end
        end

        ssh_connect(nodes) do |ssh|
          # directory setup
          ssh.leap.mkdir("/etc/leap")
          ssh.leap.mkdir("/srv/leap")
          ssh.leap.chown_root("/etc/leap")
          ssh.leap.chown_root("/srv/leap")

          # sync hiera conf
          ssh.leap.rsync_update do |server|
            node = manager.node(server.host)
            {:source => Path.named_path([:hiera, node.name]), :dest => "/etc/leap/hiera.yaml"}
          end

          # sync puppet
          #
          # what we want:
          #     puppet apply --confdir /srv/leap/puppet /srv/leap/puppet/manifests/site.pp | grep -v 'warning:.*is deprecated'
          #
          # what we get currently:
          #
          #
          ssh.set :puppet_source, [Path.platform, 'puppet'].join('/')
          ssh.set :puppet_destination, '/srv/leap'
          ssh.set :puppet_command, '/usr/bin/puppet apply --color=false'
          ssh.set :puppet_lib, "puppet/modules"
          ssh.set :puppet_parameters, '--confdir puppet puppet/manifests/site.pp'
          ssh.set :puppet_stream_output, true
          ssh.apply_puppet
        end
      end
    end

    private

    def init_submodules
      Dir.chdir Path.platform do
        statuses = assert_run! "git submodule status"
        statuses.strip.split("\n").each do |status_line|
          if status_line =~ /^-/
            submodule = status_line.split(' ')[1]
            log "Updating submodule #{submodule}"
            assert_run! "git submodule update --init #{submodule}"
          end
        end
      end
    end

  end
end