summaryrefslogtreecommitdiff
path: root/bin/puppet_command
diff options
context:
space:
mode:
authorMicah Anderson <micah@leap.se>2014-12-23 16:47:35 -0500
committerMicah Anderson <micah@leap.se>2014-12-23 16:47:35 -0500
commit574a0554a95ba74867ebd0ca4a93195bfa104c14 (patch)
treefd07b5b2ec8b32e82aa665dad117ee6e51791884 /bin/puppet_command
parent126faf8606f4911ccc3c1f55a9e0f381a46d536a (diff)
parentfc9a8af17d927085486052a53233401c42b0caab (diff)
Merge branch 'develop'
Conflicts: platform.rb Change-Id: Ic2e08e594d29a585691341c8667ac0b64933a505
Diffstat (limited to 'bin/puppet_command')
-rwxr-xr-xbin/puppet_command75
1 files changed, 52 insertions, 23 deletions
diff --git a/bin/puppet_command b/bin/puppet_command
index a6cd5a69..cdb0b027 100755
--- a/bin/puppet_command
+++ b/bin/puppet_command
@@ -7,12 +7,17 @@
# (exit codes, lockfile, multiple manifests, etc)
#
+require 'pty'
+require 'yaml'
+
PUPPET_BIN = '/usr/bin/puppet'
PUPPET_DIRECTORY = '/srv/leap'
PUPPET_PARAMETERS = '--color=false --detailed-exitcodes --libdir=puppet/lib --confdir=puppet'
SITE_MANIFEST = 'puppet/manifests/site.pp'
-SETUP_MANIFEST = 'puppet/manifests/setup.pp'
+SITE_MODULES = 'puppet/modules'
+CUSTOM_MODULES = ':files/puppet/modules'
DEFAULT_TAGS = 'leap_base,leap_service'
+HIERA_FILE = '/etc/leap/hiera.yaml'
def main
process_command_line_arguments
@@ -54,21 +59,33 @@ def apply
end
def set_hostname
- exit_code = puppet_apply(:manifest => SETUP_MANIFEST, :tags => '') do |line|
- # todo: replace setup.pp with https://github.com/lutter/ruby-augeas
- # or try this: http://www.puppetcookbook.com/posts/override-a-facter-fact.html
- if (line !~ /Finished catalog run/ || @verbosity > 2) &&
- (line !~ /dnsdomainname: Name or service not known/) &&
- (line !~ /warning: Could not retrieve fact fqdn/)
- puts line
+ hostname = hiera_file['name']
+ if hostname.nil? || hostname.empty?
+ puts('ERROR: "name" missing from hiera file')
+ exit(1)
+ end
+ current_hostname_file = File.read('/etc/hostname') rescue nil
+ current_hostname = `/bin/hostname`.strip
+
+ # set /etc/hostname
+ if current_hostname_file != hostname
+ File.open('/etc/hostname', 'w', 0611, :encoding => 'ascii') do |f|
+ f.write hostname
+ end
+ if File.read('/etc/hostname') == hostname
+ puts "Changed /etc/hostname to #{hostname}"
+ else
+ puts "ERROR: failed to update /etc/hostname"
end
end
- if exit_code == 2
- puts "Hostname updated."
- elsif exit_code == 4 || exit_code == 6
- puts "ERROR: could not update hostname."
- elsif exit_code == 0 && @verbosity > 1
- puts "No change to hostname."
+
+ # call /bin/hostname
+ if current_hostname != hostname
+ if run("/bin/hostname #{hostname}") == 0
+ puts "Changed hostname to #{hostname}"
+ else
+ puts "ERROR: call to `/bin/hostname #{hostname}` returned an error."
+ end
end
end
@@ -78,11 +95,29 @@ end
def puppet_apply(options={}, &block)
options = {:verbosity => @verbosity, :tags => @tags}.merge(options)
manifest = options[:manifest] || SITE_MANIFEST
+ modulepath = options[:module_path] || SITE_MODULES + CUSTOM_MODULES
+ fqdn = hiera_file['domain']['name']
+ domain = hiera_file['domain']['full_suffix']
Dir.chdir(PUPPET_DIRECTORY) do
- return run("#{PUPPET_BIN} apply #{custom_parameters(options)} #{PUPPET_PARAMETERS} #{manifest}", &block)
+ return run("FACTER_fqdn='#{fqdn}' FACTER_domain='#{domain}' #{PUPPET_BIN} apply #{custom_parameters(options)} --modulepath='#{modulepath}' #{PUPPET_PARAMETERS} #{manifest}", &block)
end
end
+#
+# Return a ruby object representing the contents of the hiera yaml file.
+#
+def hiera_file
+ unless File.exists?(HIERA_FILE)
+ puts("ERROR: hiera file '#{HIERA_FILE}' does not exist.")
+ exit(1)
+ end
+ $hiera_contents ||= YAML.load_file(HIERA_FILE)
+ return $hiera_contents
+rescue Exception => exc
+ puts("ERROR: problem reading hiera file '#{HIERA_FILE}' (#{exc})")
+ exit(1)
+end
+
def custom_parameters(options)
params = []
if options[:tags] && options[:tags].chars.any?
@@ -157,24 +192,18 @@ end
## this only works under ruby 1.9
##
-require "pty"
-
def run(cmd)
puts cmd if @verbosity >= 3
PTY.spawn("#{cmd}") do |output, input, pid|
begin
while line = output.gets do
yield line
- #$stdout.puts line
- #$stdout.flush
end
rescue Errno::EIO
end
Process.wait(pid) # only works in ruby 1.9, required to capture the exit status.
end
- status = $?.exitstatus
- #yield status if block_given?
- return status
+ return $?.exitstatus
rescue PTY::ChildExited
end
@@ -188,4 +217,4 @@ Signal.trap("EXIT") do
# but only after the child puppet process is also dead (I think).
end
-main() \ No newline at end of file
+main()