@ -83,6 +83,11 @@ options:
- Optionally specify a list of comma - separated channels to subscribe to upon successful registration .
required : false
default : [ ]
enable_eus :
description :
- If true , extended update support will be requested .
required : false
default : false
'''
EXAMPLES = '''
@ -127,8 +132,8 @@ EXAMPLES = '''
channels : rhel - x86_64 - server - 6 - foo - 1 , rhel - x86_64 - server - 6 - bar - 1
'''
import os
import sys
import types
import xmlrpclib
import urlparse
@ -142,14 +147,14 @@ except ImportError:
HAS_UP2DATE_CLIENT = False
# INSERT REDHAT SNIPPETS
from ansible . module_utils . redhat import *
# INSERT COMMON SNIPPETS
from ansible . module_utils . basic import *
from ansible . module_utils import redhat
from ansible . module_utils . basic import AnsibleModule , get_exception
class Rhn ( RegistrationBase) :
class Rhn ( redhat. RegistrationBase) :
def __init__ ( self , username= None , password = None ) :
RegistrationBase. __init__ ( self , username , password )
def __init__ ( self , module= None , username= None , password = None ) :
redhat. RegistrationBase. __init__ ( self , module , username , password )
self . config = self . load_config ( )
def load_config ( self ) :
@ -159,23 +164,13 @@ class Rhn(RegistrationBase):
if not HAS_UP2DATE_CLIENT :
return None
self . config = up2date_client . config . initUp2dateConfig ( )
# Add support for specifying a default value w/o having to standup some
# configuration. Yeah, I know this should be subclassed ... but, oh
# well
def get_option_default ( self , key , default = ' ' ) :
# the class in rhn-client-tools that this comes from didn't
# implement __contains__() until 2.5.x. That's why we check if
# the key is present in the dictionary that is the actual storage
if key in self . dict :
return self [ key ]
else :
return default
config = up2date_client . config . initUp2dateConfig ( )
self . config . get_option = types . MethodType ( get_option_default , self . config , up2date_client . config . Config )
return config
return self . config
@property
def server_url ( self ) :
return self . config [ ' serverURL ' ]
@property
def hostname ( self ) :
@ -185,8 +180,8 @@ class Rhn(RegistrationBase):
Returns : str
'''
url = urlparse . urlparse ( self . config[ ' serverURL ' ] )
return url [ 1 ] . replace ( ' xmlrpc. ' , ' ' )
url = urlparse . urlparse ( self . server_url )
return url [ 1 ] . replace ( ' xmlrpc. ' , ' ' )
@property
def systemid ( self ) :
@ -235,9 +230,9 @@ class Rhn(RegistrationBase):
'''
return os . path . isfile ( self . config [ ' systemIdPath ' ] )
def configure ( self , server_url ) :
def configure _server_url ( self , server_url ) :
'''
Configure s ystem for registration
Configure s erver_url for registration
'''
self . config . set ( ' serverURL ' , server_url )
@ -249,7 +244,7 @@ class Rhn(RegistrationBase):
* enabling the rhnplugin yum plugin
* disabling the subscription - manager yum plugin
'''
RegistrationBase. enable ( self )
redhat. RegistrationBase. enable ( self )
self . update_plugin_conf ( ' rhnplugin ' , True )
self . update_plugin_conf ( ' subscription-manager ' , False )
@ -259,8 +254,8 @@ class Rhn(RegistrationBase):
support will be requested .
'''
register_cmd = [ ' /usr/sbin/rhnreg_ks ' , ' --username ' , self . username , ' --password ' , self . password , ' --force ' ]
if self . module. params . get ( ' server_url' , None ) :
register_cmd . extend ( [ ' --serverUrl ' , self . module. params . get ( ' server_url' ) ] )
if self . server_url:
register_cmd . extend ( [ ' --serverUrl ' , self . server_url] )
if enable_eus :
register_cmd . append ( ' --use-eus-channel ' )
if activationkey is not None :
@ -299,9 +294,7 @@ class Rhn(RegistrationBase):
# Remove systemid file
os . unlink ( self . config [ ' systemIdPath ' ] )
def subscribe ( self , channels = [ ] ) :
if len ( channels ) < = 0 :
return
def subscribe ( self , channels ) :
if self . _is_hosted ( ) :
current_channels = self . api ( ' channel.software.listSystemChannels ' , self . systemid )
new_channels = [ item [ ' channel_label ' ] for item in current_channels ]
@ -328,20 +321,6 @@ class Rhn(RegistrationBase):
out_childs = self . api ( ' system.setChildChannels ' , self . systemid , new_childs )
return out_base and out_childs
def _subscribe ( self , channels = [ ] ) :
'''
Subscribe to requested yum repositories using ' rhn-channel ' command
'''
rhn_channel_cmd = " rhn-channel --user= ' %s ' --password= ' %s ' " % ( self . username , self . password )
rc , stdout , stderr = self . module . run_command ( rhn_channel_cmd + " --available-channels " , check_rc = True )
# Enable requested repoid's
for wanted_channel in channels :
# Each inserted repo regexp will be matched. If no match, no success.
for available_channel in stdout . rstrip ( ) . split ( ' \n ' ) : # .rstrip() because of \n at the end -> empty string at the end
if re . search ( wanted_repo , available_channel ) :
rc , stdout , stderr = self . module . run_command ( rhn_channel_cmd + " --add --channel= %s " % available_channel , check_rc = True )
def _is_hosted ( self ) :
'''
Return True if we are running against Hosted ( rhn . redhat . com ) or
@ -352,42 +331,47 @@ class Rhn(RegistrationBase):
else :
return False
def main ( ) :
# Read system RHN configuration
rhn = Rhn ( )
def main ( ) :
module = AnsibleModule (
argument_spec = dict (
state = dict ( default = ' present ' , choices = [ ' present ' , ' absent ' ] ) ,
username = dict ( default = None , required = False ) ,
password = dict ( default = None , required = False , no_log = True ) ,
server_url = dict ( default = None , required = False ) ,
activationkey = dict ( default = None , required = False , no_log = True ) ,
profilename = dict ( default = None , required = False ) ,
sslcacert = dict ( default = None , required = False , type = ' path ' ) ,
systemorgid = dict ( default = None , required = False ) ,
enable_eus = dict ( default = False , type = ' bool ' ) ,
channels = dict ( default = [ ] , type = ' list ' ) ,
)
argument_spec = dict (
state = dict ( default = ' present ' , choices = [ ' present ' , ' absent ' ] ) ,
username = dict ( default = None , required = False ) ,
password = dict ( default = None , required = False , no_log = True ) ,
server_url = dict ( default = None , required = False ) ,
activationkey = dict ( default = None , required = False , no_log = True ) ,
profilename = dict ( default = None , required = False ) ,
sslcacert = dict ( default = None , required = False , type = ' path ' ) ,
systemorgid = dict ( default = None , required = False ) ,
enable_eus = dict ( default = False , type = ' bool ' ) ,
channels = dict ( default = [ ] , type = ' list ' ) ,
)
)
if not HAS_UP2DATE_CLIENT :
module . fail_json ( msg = " Unable to import up2date_client. Is ' rhn-client-tools ' installed? " )
if not module . params [ ' server_url ' ] :
module . params [ ' server_url ' ] = rhn . config . get_option ( ' serverURL ' )
server_url = module . params [ ' server_url ' ]
username = module . params [ ' username ' ]
password = module . params [ ' password ' ]
state = module . params [ ' state ' ]
rhn . username = module . params [ ' username ' ]
rhn . password = module . params [ ' password ' ]
rhn . configure ( module . params [ ' server_url ' ] )
activationkey = module . params [ ' activationkey ' ]
profilename = module . params [ ' profilename ' ]
sslcacert = module . params [ ' sslcacert ' ]
systemorgid = module . params [ ' systemorgid ' ]
channels = module . params [ ' channels ' ]
rhn . module = module
enable_eus = module . params [ ' enable_eus ' ]
rhn = Rhn ( module = module , username = username , password = password )
# use the provided server url and persist it to the rhn config.
if server_url :
rhn . configure_server_url ( server_url )
if not rhn . server_url :
module . fail_json ( msg = " No serverURL was found (from either the ' server_url ' module arg or the config file option ' serverURL ' in /etc/sysconfig/rhn/up2date) " )
# Ensure system is registered
if state == ' present ' :
@ -400,30 +384,30 @@ def main():
# Register system
if rhn . is_registered :
module . exit_json ( changed = False , msg = " System already registered. " )
else :
try :
rhn . enable ( )
rhn . register ( module. params [ ' enable_eus' ] == True , activationkey , profilename , sslcacert , systemorgid )
rhn . subscribe ( channels )
except Exception :
e = get_exception ( )
module . fail_json ( msg = " Failed to register with ' %s ' : %s " % ( rhn . hostname , e ) )
return module . exit_json ( changed = False , msg = " System already registered. " )
try :
rhn . enable ( )
rhn . register ( enable_eus, activationkey , profilename , sslcacert , systemorgid )
rhn . subscribe ( channels )
except Exception :
e = get_exception ( )
module . fail_json ( msg = " Failed to register with ' %s ' : %s " % ( rhn . hostname , e ) )
module . exit_json ( changed = True , msg = " System successfully registered to ' %s ' . " % rhn . hostname )
module . exit_json ( changed = True , msg = " System successfully registered to ' %s ' . " % rhn . hostname )
# Ensure system is *not* registered
if state == ' absent ' :
if not rhn . is_registered :
module . exit_json ( changed = False , msg = " System already unregistered. " )
else :
try :
rhn . unregister ( )
except Exception :
e = get_exception ( )
module . fail_json ( msg = " Failed to unregister: %s " % e )
return module . exit_json ( changed = False , msg = " System already unregistered. " )
try :
rhn . unregister ( )
except Exception :
e = get_exception ( )
module . fail_json ( msg = " Failed to unregister: %s " % e )
module . exit_json ( changed = True , msg = " System successfully unregistered from %s . " % rhn . hostname )
module . exit_json ( changed = True , msg = " System successfully unregistered from %s . " % rhn . hostname )
if __name__ == ' __main__ ' :