# class Puppet::Application::Apply

### Public Instance Methods

app_defaults() click to toggle source
Calls superclass method Puppet::Application#app_defaults

    # File lib/puppet/application/apply.rb, line 136
    def app_defaults
      super.merge({
        :default_file_terminus => :file_server,
      })
    end

apply() click to toggle source

    # File lib/puppet/application/apply.rb, line 150
    def apply
      if options[:catalog] == "-"
        text = $stdin.read
      else
        text = ::File.read(options[:catalog])
      end
      catalog = read_catalog(text)
      apply_catalog(catalog)
    end

help() click to toggle source

    # File lib/puppet/application/apply.rb, line 33
      def help
        <<-'HELP'

    puppet-apply(8) -- Apply Puppet manifests locally
    ========

    SYNOPSIS
    --------
    Applies a standalone Puppet manifest to the local system.

    USAGE
    -----
    puppet apply [-h|--help] [-V|--version] [-d|--debug] [-v|--verbose]
      [-e|--execute] [--detailed-exitcodes] [-l|--logdest <file>] [--noop]
      [--catalog <catalog>] <file>

    DESCRIPTION
    -----------
    This is the standalone puppet execution tool; use it to apply
    individual manifests.

    When provided with a modulepath, via command line or config file, puppet
    apply can effectively mimic the catalog that would be served by puppet
    master with access to the same modules, although there are some subtle
    differences. When combined with scheduling and an automated system for
    pushing manifests, this can be used to implement a serverless Puppet
    site.

    Most users should use 'puppet agent' and 'puppet master' for site-wide
    manifests.

    OPTIONS
    -------
    Note that any configuration parameter that's valid in the configuration
    file is also a valid long argument. For example, 'tags' is a
    valid configuration parameter, so you can specify '--tags <class>,<tag>'
    as an argument.

    See the configuration file documentation at
    http://docs.puppetlabs.com/references/stable/configuration.html for the
    full list of acceptable parameters. A commented list of all
    configuration options can also be generated by running puppet with
    '--genconfig'.

    * --debug:
      Enable full debugging.

    * --detailed-exitcodes:
      Provide transaction information via exit codes. If this is enabled, an exit
      code of '2' means there were changes, an exit code of '4' means there were
      failures during the transaction, and an exit code of '6' means there were both
      changes and failures.

    * --help:
      Print this help message

    * --loadclasses:
      Load any stored classes. 'puppet agent' caches configured classes
      (usually at /etc/puppet/classes.txt), and setting this option causes
      all of those classes to be set in your puppet manifest.

    * --logdest:
      Where to send messages. Choose between syslog, the console, and a log
      file. Defaults to sending messages to the console.

    * --noop:
      Use 'noop' mode where Puppet runs in a no-op or dry-run mode. This
      is useful for seeing what changes Puppet will make without actually
      executing the changes.

    * --execute:
      Execute a specific piece of Puppet code

    * --verbose:
      Print extra information.

    * --catalog:
      Apply a JSON catalog (such as one generated with 'puppet master --compile'). You can
      either specify a JSON file or pipe in JSON from standard input.

    EXAMPLE
    -------
        $ puppet apply -l /tmp/manifest.log manifest.pp
        $ puppet apply --modulepath=/root/dev/modules -e "include ntpd::server"
        $ puppet apply --catalog catalog.json

    AUTHOR
    ------
    Luke Kanies

    COPYRIGHT
    ---------
    Copyright (c) 2011 Puppet Labs, LLC Licensed under the Apache 2.0 License

        HELP
      end

main() click to toggle source

    # File lib/puppet/application/apply.rb, line 160
    def main
      # Set our code or file to use.
      if options[:code] or command_line.args.length == 0
        Puppet[:code] = options[:code] || STDIN.read
      else
        manifest = command_line.args.shift
        raise "Could not find file #{manifest}" unless ::File.exist?(manifest)
        Puppet.warning("Only one file can be applied per run.  Skipping #{command_line.args.join(', ')}") if command_line.args.size > 0
        Puppet[:manifest] = manifest
      end

      unless Puppet[:node_name_fact].empty?
        # Collect our facts.
        unless facts = Puppet::Node::Facts.indirection.find(Puppet[:node_name_value])
          raise "Could not find facts for #{Puppet[:node_name_value]}"
        end

        Puppet[:node_name_value] = facts.values[Puppet[:node_name_fact]]
        facts.name = Puppet[:node_name_value]
      end

      # Find our Node
      unless node = Puppet::Node.indirection.find(Puppet[:node_name_value])
        raise "Could not find node #{Puppet[:node_name_value]}"
      end

      # Merge in the facts.
      node.merge(facts.values) if facts

      # Allow users to load the classes that puppet agent creates.
      if options[:loadclasses]
        file = Puppet[:classfile]
        if FileTest.exists?(file)
          unless FileTest.readable?(file)
            $stderr.puts "#{file} is not readable"
            exit(63)
          end
          node.classes = ::File.read(file).split(/[\s\n]+/)
        end
      end

      begin
        # Compile our catalog
        starttime = Time.now
        catalog = Puppet::Resource::Catalog.indirection.find(node.name, :use_node => node)

        # Translate it to a RAL catalog
        catalog = catalog.to_ral

        catalog.finalize

        catalog.retrieval_duration = Time.now - starttime

        exit_status = apply_catalog(catalog)

        if not exit_status
          exit(1)
        elsif options[:detailed_exitcodes] then
          exit(exit_status)
        else
          exit(0)
        end
      rescue => detail
        Puppet.log_exception(detail)
        exit(1)
      end
    end

run_command() click to toggle source

    # File lib/puppet/application/apply.rb, line 142
    def run_command
      if options[:catalog]
        apply
      else
        main
      end
    end

setup() click to toggle source

    # File lib/puppet/application/apply.rb, line 228
    def setup
      exit(Puppet.settings.print_configs ? 0 : 1) if Puppet.settings.print_configs?

      Puppet::Util::Log.newdestination(:console) unless options[:logset]
      client = nil
      server = nil

      Signal.trap(:INT) do
        $stderr.puts "Exiting"
        exit(1)
      end

      # we want the last report to be persisted locally
      Puppet::Transaction::Report.indirection.cache_class = :yaml

      if options[:debug]
        Puppet::Util::Log.level = :debug
      elsif options[:verbose]
        Puppet::Util::Log.level = :info
      end
    end