-
Notifications
You must be signed in to change notification settings - Fork 0
/
Rakefile
137 lines (110 loc) · 3.97 KB
/
Rakefile
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
# frozen_string_literal: true
require 'rake'
###############################################################################
# ansible helper
###############################################################################
namespace :ansible do
desc 'create new role'
task :create_role do
# check if we have a valid role name
if ARGV.size == 1
puts 'please set the role name as argument like `rake ansible:create_role foo`'
exit(1)
end
# set some vars
role = ARGV.last
# check if the site already exists
if Dir.exist?("roles/#{role}")
puts 'This role already exists.'
exit(1)
end
sh "ansible-galaxy init --init-path=roles/ #{role}"
puts "#{role} is ready, happy hacking!"
exit(0)
end
desc 'install requirements'
task :install do
sh 'ansible-galaxy install -r requirements.yml'
end
desc 'update requirements'
task :update do
sh 'ansible-galaxy install --force -r requirements.yml'
end
end
###############################################################################
# site handler
###############################################################################
namespace :site do
# The site being created, is compatible with auto discovery @see below
desc 'Create new ansible site (playbook, inventory, vault) and open the vault after it.'
task :create do
# check if we have a valid site name
if ARGV.size == 1
puts 'please set the site name as argument like `rake site:create foo`'
exit(1)
end
# set some vars
site = ARGV.last
vault = "#{site}.vault.yml"
vault_password_file = ".vault_#{site}_pass"
playbook = "#{site}.playbook.yml"
# check if the site already exists
if File.exist?(playbook)
puts 'This site already exists, please remove it manually if you want to replace it.'
exit(1)
end
# create a random vault password
File.open(vault_password_file, 'w') { |file| file.write(random_password) }
# copy templates
sh "cp .playbook.templ.yml #{playbook}"
sh "cp .inventory.templ.yml #{site}.inventory.yml"
# create vault
sh "ansible-vault create #{vault} --vault-password-file=.vault_#{site}_pass"
puts "#{site} is ready. Open #{playbook} in editor."
exit(0)
end
end
###############################################################################
# Autodiscovery for ansible sites
###############################################################################
FileList['./*.playbook.yml'].each do |task|
name = task.gsub(/\.\/|\.yml\z|\.playbook/, '')
namespace "#{name}" do
inventory = "#{name}.inventory.yml"
vault = "#{name}.vault.yml"
vault_password_file = ENV['ANSIBLE_VAULT_PASSWORD_FILE'] || ".vault_#{name}_pass"
namespace :ci do
task "deploy" do
sh "echo ${ANSIBLE_VAULT_PASSWORD} > #{vault_password_file}"
sh "ansible-playbook #{task} -e @#{vault} --vault-password-file=#{vault_password_file} -i #{inventory}"
end
end
desc "Deploy to #{name}"
task "deploy" do
sh "ansible-playbook #{task} -e @#{vault} --vault-password-file=#{vault_password_file} -i #{inventory}"
end
desc "Prepare hosts for ansible in #{inventory}"
task "prepare" do
sh "ansible-playbook _prep_host.yml --user root -i #{inventory}"
end
desc "Run ping against nodes of #{name} "
task "ping" do
sh "ansible all -m ping -i #{inventory}"
end
desc "Show node setup of #{name}"
task "describe-setup" do
sh "ansible all -m setup -i #{inventory}"
end
desc "Edit #{vault} for editing"
task "vault" do
sh "ansible-vault edit #{vault} --vault-password-file=#{vault_password_file}"
end
end
end
###############################################################################
# some helper methods
###############################################################################
CHARS = ('0'..'9').to_a + ('A'..'Z').to_a + ('a'..'z').to_a
def random_password(length=23)
CHARS.sort_by { rand }.join[0...length]
end