comfy 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (133) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +11 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +46 -0
  5. data/Gemfile +4 -0
  6. data/LICENSE +13 -0
  7. data/README.md +131 -0
  8. data/Rakefile +18 -0
  9. data/bin/comfy +4 -0
  10. data/comfy.gemspec +36 -0
  11. data/config/comfy.yml +20 -0
  12. data/lib/comfy/command_executioner.rb +225 -0
  13. data/lib/comfy/creator.rb +200 -0
  14. data/lib/comfy/errors/invalid_distribution_version_error.rb +1 -0
  15. data/lib/comfy/errors/no_such_distribution_version_error.rb +1 -0
  16. data/lib/comfy/errors/packer_error.rb +1 -0
  17. data/lib/comfy/errors/packer_execution_error.rb +1 -0
  18. data/lib/comfy/errors/packer_validation_error.rb +1 -0
  19. data/lib/comfy/errors.rb +4 -0
  20. data/lib/comfy/extensions/yell.rb +8 -0
  21. data/lib/comfy/settings.rb +15 -0
  22. data/lib/comfy/templater.rb +62 -0
  23. data/lib/comfy/version.rb +3 -0
  24. data/lib/comfy.rb +18 -0
  25. data/lib/templates/centos/centos.cfg.erb +47 -0
  26. data/lib/templates/centos/centos.description +20 -0
  27. data/lib/templates/centos/files/10-ipv6.conf +5 -0
  28. data/lib/templates/centos/files/check-mk-agent-meta-checks-2.0-1.noarch.rpm +0 -0
  29. data/lib/templates/centos/files/check-mk-agent-meta-key-1.0-1.noarch.rpm +0 -0
  30. data/lib/templates/centos/files/cloud.cfg +101 -0
  31. data/lib/templates/centos/files/fail2ban.local +3 -0
  32. data/lib/templates/centos/files/getty@ttyS0.service +47 -0
  33. data/lib/templates/centos/files/grub +11 -0
  34. data/lib/templates/centos/files/iptables-multiport.local +6 -0
  35. data/lib/templates/centos/files/jail.local +17 -0
  36. data/lib/templates/centos/files/krb5.conf +181 -0
  37. data/lib/templates/centos/files/ntp.conf +61 -0
  38. data/lib/templates/centos/files/pakiti-2.1.5-1.noarch.rpm +0 -0
  39. data/lib/templates/centos/files/sshd_config +152 -0
  40. data/lib/templates/centos/files/xen-domU.conf +1 -0
  41. data/lib/templates/centos/scripts/init.sh +83 -0
  42. data/lib/templates/debian/debian.cfg.erb +80 -0
  43. data/lib/templates/debian/debian.description +28 -0
  44. data/lib/templates/debian/files/.bashrc +112 -0
  45. data/lib/templates/debian/files/.gitconfig +7 -0
  46. data/lib/templates/debian/files/10-ipv6.conf +5 -0
  47. data/lib/templates/debian/files/DEPOT-GPG-KEY.cfg +32 -0
  48. data/lib/templates/debian/files/RPM-GPG-KEY-CERIT-SC.cfg +30 -0
  49. data/lib/templates/debian/files/backports.list +2 -0
  50. data/lib/templates/debian/files/cerit-cloudinit.list +2 -0
  51. data/lib/templates/debian/files/cloud.cfg +102 -0
  52. data/lib/templates/debian/files/depot.list +4 -0
  53. data/lib/templates/debian/files/depot_all.pref +6 -0
  54. data/lib/templates/debian/files/depot_check_mk.pref +5 -0
  55. data/lib/templates/debian/files/fail2ban.local +3 -0
  56. data/lib/templates/debian/files/getty@ttyS0.service +47 -0
  57. data/lib/templates/debian/files/grub +34 -0
  58. data/lib/templates/debian/files/inittab +69 -0
  59. data/lib/templates/debian/files/interfaces +15 -0
  60. data/lib/templates/debian/files/iptables-multiport.local +6 -0
  61. data/lib/templates/debian/files/jail.local +17 -0
  62. data/lib/templates/debian/files/krb5.conf +181 -0
  63. data/lib/templates/debian/files/meta-misc.list +2 -0
  64. data/lib/templates/debian/files/modules +15 -0
  65. data/lib/templates/debian/files/ntp.conf +61 -0
  66. data/lib/templates/debian/files/pakiti_2.1.5-2_all.deb +0 -0
  67. data/lib/templates/debian/files/sshd_config +131 -0
  68. data/lib/templates/debian/scripts/debian_cloud_script.sh +80 -0
  69. data/lib/templates/docker/docker.cfg.erb +87 -0
  70. data/lib/templates/docker/docker.description +21 -0
  71. data/lib/templates/docker/files/10-ipv6.conf +5 -0
  72. data/lib/templates/docker/files/DEPOT-GPG-KEY.cfg +32 -0
  73. data/lib/templates/docker/files/RPM-GPG-KEY-CERIT-SC.cfg +30 -0
  74. data/lib/templates/docker/files/cloud.cfg +109 -0
  75. data/lib/templates/docker/files/depot.list +4 -0
  76. data/lib/templates/docker/files/depot_all.pref +6 -0
  77. data/lib/templates/docker/files/depot_check_mk.pref +5 -0
  78. data/lib/templates/docker/files/docker.list +1 -0
  79. data/lib/templates/docker/files/fail2ban.local +3 -0
  80. data/lib/templates/docker/files/grub +34 -0
  81. data/lib/templates/docker/files/interfaces +15 -0
  82. data/lib/templates/docker/files/iptables-multiport.local +6 -0
  83. data/lib/templates/docker/files/jail.local +17 -0
  84. data/lib/templates/docker/files/krb5.conf +181 -0
  85. data/lib/templates/docker/files/meta-misc.list +2 -0
  86. data/lib/templates/docker/files/modules +15 -0
  87. data/lib/templates/docker/files/ntp.conf +61 -0
  88. data/lib/templates/docker/files/pakiti_2.1.5-2_all.deb +0 -0
  89. data/lib/templates/docker/files/sshd_config +131 -0
  90. data/lib/templates/docker/files/ttyS0.conf +11 -0
  91. data/lib/templates/docker/scripts/init.sh +65 -0
  92. data/lib/templates/packer.erb +93 -0
  93. data/lib/templates/scientificlinux/files/10-ipv6.conf +5 -0
  94. data/lib/templates/scientificlinux/files/check-mk-agent-meta-checks-2.0-1.noarch.rpm +0 -0
  95. data/lib/templates/scientificlinux/files/check-mk-agent-meta-key-1.0-1.noarch.rpm +0 -0
  96. data/lib/templates/scientificlinux/files/cloud.cfg +101 -0
  97. data/lib/templates/scientificlinux/files/fail2ban.local +3 -0
  98. data/lib/templates/scientificlinux/files/getty@ttyS0.service +47 -0
  99. data/lib/templates/scientificlinux/files/grub +10 -0
  100. data/lib/templates/scientificlinux/files/iptables-multiport.local +6 -0
  101. data/lib/templates/scientificlinux/files/jail.local +17 -0
  102. data/lib/templates/scientificlinux/files/krb5.conf +181 -0
  103. data/lib/templates/scientificlinux/files/ntp.conf +61 -0
  104. data/lib/templates/scientificlinux/files/pakiti-2.1.5-1.noarch.rpm +0 -0
  105. data/lib/templates/scientificlinux/files/sshd_config +150 -0
  106. data/lib/templates/scientificlinux/files/xen-domU.conf +1 -0
  107. data/lib/templates/scientificlinux/scientificlinux.cfg.erb +57 -0
  108. data/lib/templates/scientificlinux/scientificlinux.description +19 -0
  109. data/lib/templates/scientificlinux/scripts/init.sh +92 -0
  110. data/lib/templates/ubuntu/files/10-ipv6.conf +5 -0
  111. data/lib/templates/ubuntu/files/DEPOT-GPG-KEY.cfg +32 -0
  112. data/lib/templates/ubuntu/files/RPM-GPG-KEY-CERIT-SC.cfg +30 -0
  113. data/lib/templates/ubuntu/files/cloud.cfg +109 -0
  114. data/lib/templates/ubuntu/files/depot.list +4 -0
  115. data/lib/templates/ubuntu/files/depot_all.pref +6 -0
  116. data/lib/templates/ubuntu/files/depot_check_mk.pref +5 -0
  117. data/lib/templates/ubuntu/files/fail2ban.local +3 -0
  118. data/lib/templates/ubuntu/files/grub +34 -0
  119. data/lib/templates/ubuntu/files/interfaces +15 -0
  120. data/lib/templates/ubuntu/files/iptables-multiport.local +6 -0
  121. data/lib/templates/ubuntu/files/jail.local +17 -0
  122. data/lib/templates/ubuntu/files/krb5.conf +181 -0
  123. data/lib/templates/ubuntu/files/meta-misc.list +2 -0
  124. data/lib/templates/ubuntu/files/modules +15 -0
  125. data/lib/templates/ubuntu/files/ntp.conf +61 -0
  126. data/lib/templates/ubuntu/files/pakiti_2.1.5-2_all.deb +0 -0
  127. data/lib/templates/ubuntu/files/sshd_config +131 -0
  128. data/lib/templates/ubuntu/files/ttyS0.conf +11 -0
  129. data/lib/templates/ubuntu/scripts/init.sh +54 -0
  130. data/lib/templates/ubuntu/ubuntu.cfg.erb +87 -0
  131. data/lib/templates/ubuntu/ubuntu.description +21 -0
  132. data/schema/distribution_descriptor.schema +241 -0
  133. metadata +374 -0
@@ -0,0 +1,200 @@
1
+ require 'fileutils'
2
+ require 'mixlib/shellout'
3
+ require 'tmpdir'
4
+ require 'json'
5
+ require 'json-schema'
6
+ require 'cloud-appliance-descriptor'
7
+
8
+ # Creates given virtual machine images.
9
+ class Comfy::Creator
10
+ attr_accessor :data
11
+
12
+ TIMESTAMP_FORMAT = '%Y%m%d%H%M'
13
+
14
+ NEEDLE_REPLACEMENTS = {
15
+ :$v => lambda { |instance| instance.send(:version_string) },
16
+ :$t => lambda { |instance| Time.new.strftime(TIMESTAMP_FORMAT) },
17
+ :$n => lambda { |instance| instance.data[:distro]['name'] },
18
+ :$g => lambda { |instance| instance.data[:groups].join(',') }
19
+ }
20
+ REPLACEMENT_REGEX = /\$[a-zA-Z]/
21
+
22
+ # Creates a creator instance.
23
+ #
24
+ # @param options [Hashie::Mash] hash-like structure with options
25
+ def initialize(options)
26
+ @data = options.clone
27
+ end
28
+
29
+ # Method representing thw whole creation process. Prepares enviroment,
30
+ # prepare files and starts packer job.
31
+ def create
32
+ logger.info('Preparing for image creation...')
33
+
34
+ data[:server_dir] = Dir.mktmpdir('comfy')
35
+ logger.debug("Server root directory: #{data[:server_dir]}")
36
+
37
+ prepare_data
38
+ logger.debug("Prepared data: #{data}")
39
+
40
+ templater = Comfy::Templater.new data
41
+ templater.prepare_files
42
+
43
+ packer_file = "#{data[:server_dir]}/#{data[:distribution]}.packer"
44
+ run_packer(packer_file)
45
+
46
+ # let's create cloud appliance descriptor files
47
+ if data[:description]
48
+ data[:formats].each do |format|
49
+ name = data[:distribution]
50
+ major = data[:distro][:version]['major_version']
51
+ minor = data[:distro][:version]['minor_version']
52
+ dir = File.join(data[:'output-dir'], "comfy_#{name}-#{major}.#{minor}_#{format}/")
53
+ File.write(File.join(dir, "#{data[:identifier]}.json"), description(format))
54
+ end
55
+ end
56
+ end
57
+
58
+ # Cleans everything from temporary directory
59
+ def clean
60
+ if data[:server_dir]
61
+ logger.debug("Cleaning temporary directory #{data[:server_dir]}.")
62
+ FileUtils.remove_dir(data[:server_dir])
63
+ end
64
+ end
65
+
66
+ private
67
+
68
+ # Method wrapping usage of packer tool.
69
+ #
70
+ # @param packer_file descriptor file with info for packer processing.
71
+ def run_packer(packer_file)
72
+ logger.info("Calling Packer - building distribution: '#{data[:distribution]}'.")
73
+ packer = Mixlib::ShellOut.new("packer validate #{packer_file}")
74
+ packer.run_command
75
+
76
+ fail Comfy::Errors::PackerValidationError, "Packer validation failed for distribution '#{data[:distribution]}': #{packer.stdout}" if packer.error?
77
+
78
+ packer = Mixlib::ShellOut.new("packer build -parallel=false #{packer_file}", timeout: 5400)
79
+ packer.live_stream = logger
80
+ packer.run_command
81
+
82
+ fail Comfy::Errors::PackerExecutionError, "Packer finished with error for distribution '#{data[:distribution]}': #{packer.stderr}" if packer.error?
83
+
84
+ logger.info("Packer finished successfully for distribution '#{data[:distribution]}'")
85
+ end
86
+
87
+ # Preparation of various data. Method prepares description file for packer and distribution
88
+ # preseed / kickstart file.
89
+ def prepare_data
90
+ description_file = "#{data[:'template-dir']}/#{data[:distribution]}/#{data[:distribution]}.description"
91
+ JSON::Validator.validate!(Comfy::DESCRIPTION_SCHEMA_FILE, description_file)
92
+
93
+ description = File.read(description_file)
94
+ data[:distro] = JSON.parse(description)
95
+ logger.debug("Data from description file: #{data[:distro]}")
96
+
97
+ data[:distro][:version] = choose_version
98
+ logger.debug("Version selected for build: #{data[:distro][:version]}")
99
+
100
+ data[:provisioners] = {}
101
+ data[:provisioners][:scripts] = Dir.glob(File.join(data[:'template-dir'], data[:distribution], 'scripts', '*'))
102
+ data[:provisioners][:files] = Dir.glob(File.join(data[:'template-dir'], data[:distribution], 'files', '*'))
103
+
104
+ data[:password] = password
105
+ logger.debug("Temporary password: '#{data[:password]}'")
106
+
107
+ data[:identifier] = replace_needles(data[:identifier])
108
+ end
109
+
110
+ # Choose_version is a method that selects required version from available versions.
111
+ def choose_version
112
+ version = data[:version]
113
+
114
+ available_versions = []
115
+ data[:distro]['versions'].each do |v|
116
+ available_versions << { major: v['major_version'].to_i, minor: v['minor_version'].to_i, patch: v['patch_version'].to_i, version: v }
117
+ end
118
+ available_versions.sort_by! { |v| [v[:major], v[:minor], v[:patch]] }.reverse!
119
+
120
+ return available_versions.first[:version] if version == :newest
121
+
122
+ version_parts = version.split('.')
123
+ fail Comfy::Errors::InvalidDistributionVersionError, "Version '#{version}' is not a valid distribution version" if version_parts.size > 3
124
+
125
+ version_parts.map! do |part|
126
+ fail Comfy::Errors::InvalidDistributionVersionError, "Version '#{version}' is not a valid distribution version" unless part =~ /\A\d+\z/
127
+
128
+ part.to_i
129
+ end
130
+
131
+ selected = available_versions.select { |v| v[:major] == version_parts[0] }
132
+ if version_parts.size > 1
133
+ selected = selected.select { |v| v[:minor] == version_parts[1] }
134
+
135
+ if version_parts.size > 2
136
+ selected = selected.select { |v| v[:patch] == version_parts[2] }
137
+ end
138
+ end
139
+
140
+ fail Comfy::Errors::NoSuchDistributionVersionError, "No version '#{version}' available for distribution '#{data[:distribution]}'" if selected.empty?
141
+
142
+ selected.sort_by { |v| [v[:major], v[:minor], v[:patch]] }.reverse.first[:version]
143
+ end
144
+
145
+ # Method generating a temporary random password used while creating image.
146
+ #
147
+ # @return [String] password
148
+ def password
149
+ o = [('a'..'z'), ('A'..'Z')].map(&:to_a).flatten
150
+ (0...100).map { o[rand(o.length)] }.join
151
+ end
152
+
153
+ # Description returns cloud appliance descriptor JSON. It uses information gathered from command line arguments
154
+ # and the config file.
155
+ #
156
+ # @param builder [Symbol] builder used in the description of the cloud appliance descriptor
157
+ #
158
+ # @return [Json] appliance descriptor in Json format
159
+ def description(builder)
160
+ # FIXME? mapping platforms/builders to formats is hardcoded for now, nothing else is supported
161
+ formats = { 'virtualbox' => 'ova', 'qemu' => 'qcow2' }
162
+ vm_dir = "comfy_#{data[:distribution]}-#{data[:distro][:version]['major_version']}.#{data[:distro][:version]['minor_version']}_#{builder}"
163
+ vm_name = "#{vm_dir}.#{formats[builder]}"
164
+ disk_path = File.join(data[:'output-dir'],vm_dir,vm_name)
165
+
166
+ os = Cloud::Appliance::Descriptor::Os.new distribution: data[:distribution], version: version_string
167
+ disk = Cloud::Appliance::Descriptor::Disk.new type: :os, format: formats[builder], path: disk_path
168
+
169
+ appliance = Cloud::Appliance::Descriptor::Appliance.new action: :registration, os: os, disks: [disk]
170
+ appliance.title = data[:distro]['name']
171
+ appliance.identifier = data[:identifier]
172
+ appliance.version = Time.new.strftime(TIMESTAMP_FORMAT)
173
+ appliance.groups = data[:groups]
174
+
175
+ appliance.to_json
176
+ end
177
+
178
+ # Replace needles in the argument.
179
+ # Replacements are picked from NEEDLE_REPLACEMENTS constant.
180
+ #
181
+ # @param [String] format_string string with needles to be replaced
182
+ #
183
+ # @return [String] format_string with all needles replaced
184
+ def replace_needles(format_string)
185
+ format_string.gsub(REPLACEMENT_REGEX) do |match|
186
+ NEEDLE_REPLACEMENTS.key?(match.to_sym) ? NEEDLE_REPLACEMENTS[match.to_sym].call(self) : match
187
+ end
188
+ end
189
+
190
+ # Simple method used to return the version string
191
+ #
192
+ # @return [String] string which contains major, minor, and patch version (if possible).
193
+ def version_string
194
+ result = []
195
+ result << data[:distro][:version]['major_version']
196
+ result << data[:distro][:version]['minor_version']
197
+ result << data[:distro][:version]['patch_version']
198
+ result.compact.join('.')
199
+ end
200
+ end
@@ -0,0 +1 @@
1
+ class Comfy::Errors::InvalidDistributionVersionError < StandardError; end
@@ -0,0 +1 @@
1
+ class Comfy::Errors::NoSuchDistributionVersionError < StandardError; end
@@ -0,0 +1 @@
1
+ class Comfy::Errors::PackerError < StandardError; end
@@ -0,0 +1 @@
1
+ class Comfy::Errors::PackerExecutionError < Comfy::Errors::PackerError; end
@@ -0,0 +1 @@
1
+ class Comfy::Errors::PackerValidationError < Comfy::Errors::PackerError; end
@@ -0,0 +1,4 @@
1
+ module Comfy::Errors
2
+ require File.join(File.dirname(__FILE__), "#{self.name.demodulize.underscore}", 'packer_error')
3
+ Dir.glob(File.join(File.dirname(__FILE__), "#{self.name.demodulize.underscore}", '*.rb')) { |error_file| require error_file.chomp('.rb') }
4
+ end
@@ -0,0 +1,8 @@
1
+ require 'yell'
2
+
3
+ # Monkeypatch for Yell
4
+ class Yell::Logger
5
+ def <<(x)
6
+ info x.strip
7
+ end
8
+ end
@@ -0,0 +1,15 @@
1
+ require 'settingslogic'
2
+
3
+ class Comfy::Settings < Settingslogic
4
+ CONFIGURATION = 'comfy.yml'
5
+
6
+ # three possible configuration file locations in order by preference
7
+ # if configuration file is found rest of the locations are ignored
8
+ source "#{ENV['HOME']}/.comfy/#{CONFIGURATION}"\
9
+ if File.exist?("#{ENV['HOME']}/.comfy/#{CONFIGURATION}")
10
+ source "/etc/comfy/#{CONFIGURATION}"\
11
+ if File.exist?("/etc/comfy/#{CONFIGURATION}")
12
+ source "#{File.dirname(__FILE__)}/../../config/#{CONFIGURATION}"
13
+
14
+ namespace 'production'
15
+ end
@@ -0,0 +1,62 @@
1
+ require 'tempfile'
2
+ require 'erb'
3
+ require 'fileutils'
4
+ require 'tmpdir'
5
+
6
+ # Class used for preparing and filling file templates.
7
+ class Comfy::Templater
8
+ attr_reader :data
9
+
10
+ # Creates an instance of Templater.
11
+ #
12
+ # @param data [Hash] prepared data with distro, provisioners, files, password and identifier info.
13
+ def initialize(data)
14
+ @data = data
15
+ end
16
+
17
+ # Prepares *.json and *.cfg files from templates for selected distribution
18
+ def prepare_files
19
+ prepare_file('cfg')
20
+ prepare_file('packer', true)
21
+ end
22
+
23
+ private
24
+
25
+ # Method prepares .erb file with given data.
26
+ #
27
+ # @param name [String] type of file for preparation.
28
+ # @param packer [Boolean] (implicite value = false).
29
+ def prepare_file(name, packer = false)
30
+ logger.debug("Creating temporary #{name} file...")
31
+ tmp = Tempfile.new("comfy_#{name}")
32
+ logger.debug("Temporary file '#{tmp.path}' was created.")
33
+
34
+ output = File.join(data[:server_dir], "#{data[:distribution]}.#{name}")
35
+
36
+ logger.debug("Writing to temporary #{name} file...")
37
+ template_path = File.join(data[:'template-dir'], data[:distribution], "#{data[:distribution]}.#{name}.erb")
38
+ template_path = File.join(data[:'template-dir'], 'packer.erb') if packer
39
+ write_to_tmp(tmp, populate_template(template_path))
40
+
41
+ logger.debug("Copying #{name} file to its proper location...")
42
+ FileUtils.cp(tmp.path, output)
43
+
44
+ logger.debug("Cleaning temporary #{name} file...")
45
+ tmp.close(true)
46
+ end
47
+
48
+ def write_to_tmp(tmp, data)
49
+ tmp.write(data)
50
+ tmp.flush
51
+ end
52
+
53
+ # Actual filling of .erb fils with given info.
54
+ #
55
+ # @param template [String] path to template file.
56
+ def populate_template(template)
57
+ logger.debug("Populating template '#{template}'")
58
+ erb = ERB.new(File.read(template), nil, '-')
59
+ erb.filename = template
60
+ erb.result(binding)
61
+ end
62
+ end
@@ -0,0 +1,3 @@
1
+ module Comfy
2
+ VERSION = '0.2.0'
3
+ end
data/lib/comfy.rb ADDED
@@ -0,0 +1,18 @@
1
+ require 'comfy/settings'
2
+
3
+ module Comfy
4
+ GEM_DIR = File.realdirpath(File.join(File.dirname(__FILE__), '..'))
5
+ DESCRIPTION_SCHEMA_FILE = File.join(GEM_DIR, 'schema', 'distribution_descriptor.schema')
6
+ TEMPLATE_DIR = Comfy::Settings['template-dir'] || File.join(GEM_DIR, 'lib', 'templates')
7
+ PACKER_FILE = File.join(TEMPLATE_DIR, 'packer.erb')
8
+
9
+ require 'active_support/all'
10
+
11
+ require 'comfy/extensions/yell'
12
+
13
+ require 'comfy/command_executioner'
14
+ require 'comfy/version'
15
+ require 'comfy/templater'
16
+ require 'comfy/creator'
17
+ require 'comfy/errors'
18
+ end
@@ -0,0 +1,47 @@
1
+ ### Kickstart
2
+ ## Fresh install, not an upgrade
3
+ install
4
+ url --url=http://mirror.nextlayer.at/centos/<%= @data[:distro][:version]['major_version'] %>.<%= @data[:distro][:version]['minor_version'] %>.<%= @data[:distro][:version]['patch_version'] %>/os/x86_64/
5
+ lang en_US.UTF-8
6
+ keyboard us
7
+ timezone UTC
8
+ ## Disk Partitioning - how the boot loader should be installed, delete all partitions/mbr, then create
9
+ bootloader --location=mbr
10
+ zerombr
11
+ clearpart --all --initlabel
12
+ part / --size=1 --grow --fstype ext4
13
+ ## Don't use GUI
14
+ text
15
+ ## Don't configure X
16
+ skipx
17
+ ## Firstboot - the druid that helps you to set up the system after install - disabled
18
+ firstboot --disabled
19
+ ## Authentication
20
+ ## Sets up the authentication options - use shadow passwords, encryption for user passwords
21
+ authconfig --enableshadow --passalgo=sha512
22
+ auth --useshadow --enablemd5
23
+ ## Sets the system's root password
24
+ rootpw <%= @data[:password] %>
25
+ ## Configure NICs - use dhcp - disable IPv6
26
+ network --device=eth0 --bootproto dhcp --onboot=yes --noipv6
27
+ network --device=eth1 --bootproto dhcp --onboot=yes --noipv6
28
+ ## Firewall - enable and open ssh port
29
+ firewall --enabled --service=ssh
30
+ ## Selinux - disable
31
+ selinux --disabled
32
+ ## Reboot the machine after the install
33
+ reboot
34
+ %packages --nobase
35
+ ## Add basic packages groups
36
+ @core
37
+ ## Add basic packages
38
+ wget
39
+ curl
40
+ bzip2
41
+ ## Add extra packages
42
+ openssh-clients
43
+ openssh-server
44
+ %end
45
+ %post
46
+ /usr/bin/yum -y install sudo
47
+ %end
@@ -0,0 +1,20 @@
1
+ {
2
+ "name": "CentOS",
3
+ "versions": [{
4
+ "major_version": "7",
5
+ "minor_version": "1",
6
+ "patch_version": "1503",
7
+ "iso_url": "http://merlin.fit.vutbr.cz/mirrors/centos/7/isos/x86_64/CentOS-7-x86_64-NetInstall-1503.iso",
8
+ "iso_checksum": "498bb78789ddc7973fe14358822eb1b48521bbaca91c17bd132c7f8c903d79b3"
9
+ }],
10
+ "boot_command": "linux ks=http://{{ .HTTPIP }}:{{ .HTTPPort }}",
11
+ "qemu": {
12
+ "accelerator": "kvm",
13
+ "qemuargs": [ [ "-m", "1024M" ] ]
14
+ },
15
+ "virtualbox": {
16
+ "guest_os_type": "RedHat_64",
17
+ "vboxmanage": [ ["modifyvm", "{{.Name}}", "--memory", "1024"] ],
18
+ "guest_additions_mode": "disable"
19
+ }
20
+ }
@@ -0,0 +1,5 @@
1
+ net.ipv6.conf.all.disable_ipv6 = 1
2
+ net.ipv6.conf.default.disable_ipv6 = 1
3
+ net.ipv6.conf.lo.disable_ipv6 = 1
4
+ net.ipv6.conf.eth0.disable_ipv6 = 1
5
+ net.ipv6.conf.eth1.disable_ipv6 = 1
@@ -0,0 +1,101 @@
1
+ # If this is set, 'root' will not be able to ssh in and they
2
+ # will get a message to login instead as the above $user (ubuntu)
3
+ disable_root: False
4
+ user: root
5
+ ssh_pwauth: False
6
+ ssh_deletekeys: True
7
+ ssh_genkeytypes: ['rsa', 'dsa']
8
+ ssh_svcname: sshd
9
+
10
+ # This will cause the set+update hostname module to not operate (if true)
11
+ preserve_hostname: false
12
+ cc_ready_cmd: ['/bin/true']
13
+ mount_default_fields: [~, ~, 'auto', 'defaults,nofail', '0', '2']
14
+ syslog_fix_perms: ~
15
+ manage_etc_hosts: True
16
+
17
+ # Update and upgrade system on first boot
18
+ apt_preserve_sources_list: True
19
+ package_update: True
20
+ package_upgrade: True
21
+ package_reboot_if_required: True
22
+
23
+ # work only with OpenNebula, use network based datasource,
24
+ # so that we can successfully resolve IPv4 based hostname
25
+ disable_ec2_metadata: True
26
+ datasource_list: ['OpenNebula']
27
+ datasource:
28
+ OpenNebula:
29
+ dsmode: net
30
+
31
+ # The modules that run in the 'init' stage
32
+ cloud_init_modules:
33
+ - migrator
34
+ - seed_random
35
+ - bootcmd
36
+ - write-files
37
+ - growpart
38
+ - resizefs
39
+ - set_hostname
40
+ - update_hostname
41
+ - update_etc_hosts
42
+ - ca-certs
43
+ - rsyslog
44
+ - users-groups
45
+ - ssh
46
+
47
+ # The modules that run in the 'config' stage
48
+ cloud_config_modules:
49
+ # Emit the cloud config ready event
50
+ # this can be used by upstart jobs for 'start on cloud-config'.
51
+ - emit_upstart
52
+ - disk_setup
53
+ - mounts
54
+ - ssh-import-id
55
+ - locale
56
+ - set-passwords
57
+ - grub-dpkg
58
+ - apt-pipelining
59
+ - apt-configure
60
+ - package-update-upgrade-install
61
+ - landscape
62
+ - timezone
63
+ - puppet
64
+ - chef
65
+ - salt-minion
66
+ - mcollective
67
+ - disable-ec2-metadata
68
+ - runcmd
69
+ - byobu
70
+
71
+ # The modules that run in the 'final' stage
72
+ cloud_final_modules:
73
+ - rightscale_userdata
74
+ - scripts-per-once
75
+ - scripts-per-boot
76
+ - scripts-per-instance
77
+ - scripts-user
78
+ - ssh-authkey-fingerprints
79
+ - keys-to-console
80
+ - phone-home
81
+ - final-message
82
+ - power-state-change
83
+
84
+ # System and/or distro specific settings
85
+ # (not accessible to handlers/transforms)
86
+ system_info:
87
+ # This will affect which distro class gets used
88
+ distro: rhel
89
+ # Other config here will be given to the distro class and/or path classes
90
+ paths:
91
+ cloud_dir: /var/lib/cloud/
92
+ templates_dir: /etc/cloud/templates/
93
+ upstart_dir: /etc/init/
94
+ package_mirrors:
95
+ - arches: [default]
96
+ failsafe:
97
+ primary: http://http.us.debian.org/debian/
98
+ security: http://security.debian.org/
99
+ ssh_svcname: sshd
100
+
101
+ # vim:syntax=yaml
@@ -0,0 +1,3 @@
1
+ [Definition]
2
+
3
+ logtarget = SYSLOG
@@ -0,0 +1,47 @@
1
+ # This file is part of systemd.
2
+ #
3
+ # systemd is free software; you can redistribute it and/or modify it
4
+ # under the terms of the GNU Lesser General Public License as published by
5
+ # the Free Software Foundation; either version 2.1 of the License, or
6
+ # (at your option) any later version.
7
+
8
+ [Unit]
9
+ Description=Getty on %I
10
+ Documentation=man:agetty(8) man:systemd-getty-generator(8)
11
+ Documentation=http://0pointer.de/blog/projects/serial-console.html
12
+ After=systemd-user-sessions.service plymouth-quit-wait.service
13
+ After=rc-local.service
14
+
15
+ # If additional gettys are spawned during boot then we should make
16
+ # sure that this is synchronized before getty.target, even though
17
+ # getty.target didn't actually pull it in.
18
+ Before=getty.target
19
+ IgnoreOnIsolate=yes
20
+
21
+ # On systems without virtual consoles, don't start any getty. Note
22
+ # that serial gettys are covered by serial-getty@.service, not this
23
+ # unit.
24
+ ConditionPathExists=/dev/tty0
25
+
26
+ [Service]
27
+ # the VT is cleared by TTYVTDisallocate
28
+ ExecStart=-/sbin/agetty --autologin root --noclear %I $TERM
29
+ Type=idle
30
+ Restart=always
31
+ RestartSec=0
32
+ UtmpIdentifier=%I
33
+ TTYPath=/dev/%I
34
+ TTYReset=yes
35
+ TTYVHangup=yes
36
+ TTYVTDisallocate=yes
37
+ KillMode=process
38
+ IgnoreSIGPIPE=no
39
+ SendSIGHUP=yes
40
+
41
+ # Unset locale for the console getty since the console has problems
42
+ # displaying some internationalized messages.
43
+ Environment=LANG= LANGUAGE= LC_CTYPE= LC_NUMERIC= LC_TIME= LC_COLLATE= LC_MONETARY= LC_MESSAGES= LC_PAPER= LC_NAME= LC_ADDRESS= LC_TELEPHONE= LC_MEASUREMENT= LC_IDENTIFICATION=
44
+
45
+ [Install]
46
+ WantedBy=getty.target
47
+ Alias=getty@ttys0.service
@@ -0,0 +1,11 @@
1
+ GRUB_TIMEOUT=5
2
+ GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
3
+ GRUB_DEFAULT=saved
4
+ GRUB_DISABLE_SUBMENU=true
5
+ GRUB_TERMINAL_OUTPUT="console"
6
+ GRUB_CMDLINE_LINUX="vconsole.keymap=us crashkernel=auto vconsole.font=latarcyrheb-sun16 rhgb quiet net.ifnames=0 biosdevname=0 console=ttys0,115200n8 console=tty0"
7
+ #GRUB_CMDLINE_LINUX="console=ttys0,115200n8 console=tty0"
8
+ GRUB_DISABLE_RECOVERY="true"
9
+ GRUB_TERMINAL="serial"
10
+ GRUB_SERIAL_COMMAND="serial --speed=115200 --unit=0 --word=8 --parity=no --stop=1"
11
+
@@ -0,0 +1,6 @@
1
+ [Definition]
2
+
3
+ actionban = iptables -I fail2ban-<name> 1 -s <ip> -j REJECT
4
+
5
+ actionunban = iptables -D fail2ban-<name> -s <ip> -j REJECT
6
+
@@ -0,0 +1,17 @@
1
+ [DEFAULT]
2
+
3
+ # Seznam vygenerovany skriptem /software/meta-admin/scripts/get_nodes_ips
4
+ # Vygeneruje pouze C site, tzn. je tam o nekolik set hostu vic nez ve skutecnosti
5
+
6
+ ignoreip = 127.0.0.1 147.228.1.0/24 147.251.17.0/24 147.228.240.0/24 147.228.241.0/24 147.231.11.0/24 147.231.18.0/24 147.251.11.0/24 147.251.252.0/24 147.251.254.0/24 147.251.3.0/24 147.251.84.0/24 147.251.9.0/24 195.113.0.0/24 195.113.123.0/24 195.113.209.0/24 195.113.214.0/24 78.128.210.0/24
7
+
8
+ [ssh]
9
+
10
+ enabled = true
11
+ port = ssh
12
+ filter = sshd
13
+ logpath = /var/log/auth.log
14
+ maxretry = 100
15
+ findtime = 86400
16
+ bantime = 1209600
17
+