summaryrefslogtreecommitdiff
path: root/lib/chef/resource/rhsm_register.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/chef/resource/rhsm_register.rb')
-rw-r--r--lib/chef/resource/rhsm_register.rb170
1 files changed, 170 insertions, 0 deletions
diff --git a/lib/chef/resource/rhsm_register.rb b/lib/chef/resource/rhsm_register.rb
new file mode 100644
index 0000000000..47fe67d1cf
--- /dev/null
+++ b/lib/chef/resource/rhsm_register.rb
@@ -0,0 +1,170 @@
+#
+# Copyright:: 2015-2018 Chef Software, Inc.
+# License:: Apache License, Version 2.0
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+require "chef/resource"
+require "shellwords"
+
+class Chef
+ class Resource
+ class RhsmRegister < Chef::Resource
+ resource_name :rhsm_register
+
+ description "A resource for registering a node with the Red Hat Subscription Manager"\
+ " or a local Red Hat Satellite server."
+ introduced "14.0"
+
+ property :activation_key,
+ [String, Array],
+ coerce: proc { |x| Array(x) },
+ description: "A String or array of the activation keys to use when registering. You must also specify the organization property if using activation_key."
+
+ property :satellite_host,
+ String,
+ description: "The FQDN of the Satellite host to register with. If not specified, the host will be registered with Red Hat's public RHSM service."
+
+ property :organization,
+ String,
+ description: "The organization to use when registering, required when using an activation key"
+
+ property :environment,
+ String,
+ description: "The environment to use when registering, required when using username and password"
+
+ property :username,
+ String,
+ description: "The username to use when registering. Not applicable if using an activation key. If specified, password and environment are also required."
+
+ property :password,
+ String,
+ description: "The password to use when registering. Not applicable if using an activation key. If specified, username and environment are also required."
+
+ property :auto_attach,
+ [TrueClass, FalseClass],
+ description: "If true, RHSM will attempt to automatically attach the host to applicable subscriptions. It is generally better to use an activation key with the subscriptions pre-defined.",
+ default: false
+
+ property :install_katello_agent,
+ [TrueClass, FalseClass],
+ description: "If true, the 'katello-agent' RPM will be installed.",
+ default: true
+
+ property :force,
+ [TrueClass, FalseClass],
+ description: "If true, the system will be registered even if it is already registered. Normally, any register operations will fail if the machine is has already registered.",
+ default: false
+
+ action :register do
+ description "Register the node with RHSM"
+
+ package "subscription-manager"
+
+ unless new_resource.satellite_host.nil? || registered_with_rhsm?
+ remote_file "#{Chef::Config[:file_cache_path]}/katello-package.rpm" do
+ source "http://#{new_resource.satellite_host}/pub/katello-ca-consumer-latest.noarch.rpm"
+ action :create
+ notifies :install, "yum_package[katello-ca-consumer-latest]", :immediately
+ not_if { katello_cert_rpm_installed? }
+ end
+
+ yum_package "katello-ca-consumer-latest" do
+ options "--nogpgcheck"
+ source "#{Chef::Config[:file_cache_path]}/katello-package.rpm"
+ action :nothing
+ end
+
+ file "#{Chef::Config[:file_cache_path]}/katello-package.rpm" do
+ action :delete
+ end
+ end
+
+ execute "Register to RHSM" do
+ sensitive new_resource.sensitive
+ command register_command
+ action :run
+ not_if { registered_with_rhsm? }
+ end
+
+ yum_package "katello-agent" do
+ action :install
+ only_if { new_resource.install_katello_agent && !new_resource.satellite_host.nil? }
+ end
+ end
+
+ action :unregister do
+ description "Unregister the node from RHSM"
+
+ execute "Unregister from RHSM" do
+ command "subscription-manager unregister"
+ action :run
+ only_if { registered_with_rhsm? }
+ notifies :run, "execute[Clean RHSM Config]", :immediately
+ end
+
+ execute "Clean RHSM Config" do
+ command "subscription-manager clean"
+ action :nothing
+ end
+ end
+
+ action_class do
+ def registered_with_rhsm?
+ cmd = Mixlib::ShellOut.new("subscription-manager status", env: { LANG: "en_US" })
+ cmd.run_command
+ !cmd.stdout.match(/Overall Status: Unknown/)
+ end
+
+ def katello_cert_rpm_installed?
+ cmd = Mixlib::ShellOut.new("rpm -qa | grep katello-ca-consumer")
+ cmd.run_command
+ !cmd.stdout.match(/katello-ca-consumer/).nil?
+ end
+
+ def register_command
+ command = %w{subscription-manager register}
+
+ unless new_resource.activation_key.empty?
+ raise "Unable to register - you must specify organization when using activation keys" if new_resource.organization.nil?
+
+ command << new_resource.activation_key.map { |key| "--activationkey=#{Shellwords.shellescape(key)}" }
+ command << "--org=#{Shellwords.shellescape(new_resource.organization)}"
+ command << "--force" if new_resource.force
+
+ return command.join(" ")
+ end
+
+ if new_resource.username && new_resource.password
+ raise "Unable to register - you must specify environment when using username/password" if new_resource.environment.nil? && using_satellite_host?
+
+ command << "--username=#{Shellwords.shellescape(new_resource.username)}"
+ command << "--password=#{Shellwords.shellescape(new_resource.password)}"
+ command << "--environment=#{Shellwords.shellescape(new_resource.environment)}" if using_satellite_host?
+ command << "--auto-attach" if new_resource.auto_attach
+ command << "--force" if new_resource.force
+
+ return command.join(" ")
+ end
+
+ raise "Unable to create register command - you must specify activation_key or username/password"
+ end
+
+ def using_satellite_host?
+ !new_resource.satellite_host.nil?
+ end
+ end
+ end
+ end
+end