2017-02-15 19:59:03 +03:00
#!/usr/bin/python
2017-05-11 19:26:36 +03:00
# coding: utf-8 -*-
2017-02-15 19:59:03 +03:00
2018-09-19 17:02:27 +03:00
# Copyright: (c) 2017, Wayne Witzel III <wayne@riotousliving.com>
Remove wildcard imports
Made the following changes:
* Removed wildcard imports
* Replaced long form of GPL header with short form
* Removed get_exception usage
* Added from __future__ boilerplate
* Adjust division operator to // where necessary
For the following files:
* web_infrastructure modules
* system modules
* linode, lxc, lxd, atomic, cloudscale, dimensiondata, ovh, packet,
profitbricks, pubnub, smartos, softlayer, univention modules
* compat dirs (disabled as its used intentionally)
2017-07-28 08:55:24 +03:00
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
from __future__ import absolute_import , division , print_function
__metaclass__ = type
2017-02-15 19:59:03 +03:00
2017-08-16 06:16:38 +03:00
ANSIBLE_METADATA = { ' metadata_version ' : ' 1.1 ' ,
2017-03-14 19:07:22 +03:00
' status ' : [ ' preview ' ] ,
' supported_by ' : ' community ' }
2017-02-15 19:59:03 +03:00
DOCUMENTATION = '''
- - -
module : tower_credential
2017-03-09 19:20:25 +03:00
author : " Wayne Witzel III (@wwitzel3) "
2017-02-15 19:59:03 +03:00
version_added : " 2.3 "
short_description : create , update , or destroy Ansible Tower credential .
description :
- Create , update , or destroy Ansible Tower credentials . See
U ( https : / / www . ansible . com / tower ) for an overview .
options :
name :
description :
- The name to use for the credential .
required : True
description :
description :
- The description to use for the credential .
user :
description :
- User that should own this credential .
team :
description :
- Team that should own this credential .
project :
description :
- Project that should for this credential .
organization :
description :
- Organization that should own the credential .
kind :
description :
- Type of credential being added .
required : True
2018-02-22 21:01:08 +03:00
choices : [ " ssh " , " vault " , " net " , " scm " , " aws " , " vmware " , " satellite6 " , " cloudforms " , " gce " , " azure_rm " , " openstack " , " rhv " , " insights " , " tower " ]
2017-02-15 19:59:03 +03:00
host :
description :
- Host for this credential .
username :
description :
- Username for this credential . access_key for AWS .
password :
description :
- Password for this credential . Use ASK for prompting . secret_key for AWS . api_key for RAX .
ssh_key_data :
description :
2018-09-07 20:41:09 +03:00
- SSH private key content . To extract the content from a file path , use the lookup function ( see examples ) .
required : False
2017-02-15 19:59:03 +03:00
ssh_key_unlock :
description :
- Unlock password for ssh_key . Use ASK for prompting .
authorize :
description :
2018-03-15 06:58:50 +03:00
- Should use authorize for net type .
2018-03-16 00:15:24 +03:00
type : bool
default : ' no '
2017-02-15 19:59:03 +03:00
authorize_password :
description :
2018-03-15 06:58:50 +03:00
- Password for net credentials that require authorize .
2017-02-15 19:59:03 +03:00
client :
description :
- Client or application ID for azure_rm type .
2018-03-16 20:28:19 +03:00
security_token :
description :
- STS token for aws type .
version_added : " 2.6 "
2017-02-15 19:59:03 +03:00
secret :
description :
- Secret token for azure_rm type .
subscription :
description :
- Subscription ID for azure_rm type .
tenant :
description :
- Tenant ID for azure_rm type .
domain :
description :
- Domain for openstack type .
become_method :
description :
- Become method to Use for privledge escalation .
2017-05-20 00:24:54 +03:00
choices : [ " None " , " sudo " , " su " , " pbrun " , " pfexec " , " pmrun " ]
2017-02-15 19:59:03 +03:00
become_username :
description :
- Become username . Use ASK for prompting .
become_password :
description :
- Become password . Use ASK for prompting .
vault_password :
description :
2018-06-15 08:08:04 +03:00
- Vault password . Use ASK for prompting .
2017-02-15 19:59:03 +03:00
state :
description :
- Desired state of the resource .
choices : [ " present " , " absent " ]
2018-03-16 00:15:24 +03:00
default : " present "
2017-10-02 23:21:24 +03:00
extends_documentation_fragment : tower
2017-02-15 19:59:03 +03:00
'''
EXAMPLES = '''
- name : Add tower credential
tower_credential :
name : Team Name
description : Team Description
organization : test - org
state : present
tower_config_file : " ~/tower_cli.cfg "
2018-09-07 20:41:09 +03:00
- name : Create a valid SCM credential from a private_key file
tower_credential :
name : SCM Credential
organization : Default
state : present
kind : scm
username : joe
password : secret
ssh_key_data : " {{ lookup( ' file ' , ' /tmp/id_rsa ' ) }} "
ssh_key_unlock : " passphrase "
2017-02-15 19:59:03 +03:00
'''
2017-10-02 23:21:24 +03:00
import os
2018-03-16 20:28:19 +03:00
from ansible . module_utils . _text import to_text
2018-08-02 18:17:39 +03:00
from ansible . module_utils . ansible_tower import TowerModule , tower_auth_config , tower_check_mode
2017-10-02 23:21:24 +03:00
2017-02-15 19:59:03 +03:00
try :
import tower_cli
import tower_cli . utils . exceptions as exc
from tower_cli . conf import settings
except ImportError :
2017-10-02 23:21:24 +03:00
pass
2017-02-15 19:59:03 +03:00
2018-02-22 19:17:56 +03:00
KIND_CHOICES = {
' ssh ' : ' Machine ' ,
' vault ' : ' Ansible Vault ' ,
' net ' : ' Network ' ,
' scm ' : ' Source Control ' ,
' aws ' : ' Amazon Web Services ' ,
' vmware ' : ' VMware vCenter ' ,
' satellite6 ' : ' Red Hat Satellite 6 ' ,
' cloudforms ' : ' Red Hat CloudForms ' ,
' gce ' : ' Google Compute Engine ' ,
' azure_rm ' : ' Microsoft Azure Resource Manager ' ,
' openstack ' : ' OpenStack ' ,
' rhv ' : ' Red Hat Virtualization ' ,
' insights ' : ' Insights ' ,
' tower ' : ' Ansible Tower ' ,
}
def credential_type_for_v1_kind ( params , module ) :
credential_type_res = tower_cli . get_resource ( ' credential_type ' )
kind = params . pop ( ' kind ' )
arguments = { ' managed_by_tower ' : True }
if kind == ' ssh ' :
if params . get ( ' vault_password ' ) :
arguments [ ' kind ' ] = ' vault '
else :
arguments [ ' kind ' ] = ' ssh '
elif kind in ( ' net ' , ' scm ' , ' insights ' , ' vault ' ) :
arguments [ ' kind ' ] = kind
elif kind in KIND_CHOICES :
arguments . update ( dict (
kind = ' cloud ' ,
name = KIND_CHOICES [ kind ]
) )
return credential_type_res . get ( * * arguments )
2018-01-15 18:39:11 +03:00
2017-02-15 19:59:03 +03:00
def main ( ) :
2017-10-02 23:21:24 +03:00
2018-08-02 18:17:39 +03:00
argument_spec = dict (
2017-10-02 23:21:24 +03:00
name = dict ( required = True ) ,
user = dict ( ) ,
team = dict ( ) ,
kind = dict ( required = True ,
2018-02-22 19:17:56 +03:00
choices = KIND_CHOICES . keys ( ) ) ,
2017-10-02 23:21:24 +03:00
host = dict ( ) ,
username = dict ( ) ,
password = dict ( no_log = True ) ,
2018-09-07 20:41:09 +03:00
ssh_key_data = dict ( no_log = True , type = ' str ' ) ,
2017-10-02 23:21:24 +03:00
ssh_key_unlock = dict ( no_log = True ) ,
authorize = dict ( type = ' bool ' , default = False ) ,
authorize_password = dict ( no_log = True ) ,
client = dict ( ) ,
2018-03-16 20:28:19 +03:00
security_token = dict ( ) ,
2017-10-02 23:21:24 +03:00
secret = dict ( ) ,
tenant = dict ( ) ,
subscription = dict ( ) ,
domain = dict ( ) ,
become_method = dict ( ) ,
become_username = dict ( ) ,
become_password = dict ( no_log = True ) ,
vault_password = dict ( no_log = True ) ,
description = dict ( ) ,
organization = dict ( required = True ) ,
project = dict ( ) ,
state = dict ( choices = [ ' present ' , ' absent ' ] , default = ' present ' ) ,
2018-08-02 18:17:39 +03:00
)
2017-10-02 23:21:24 +03:00
2018-08-02 18:17:39 +03:00
module = TowerModule ( argument_spec = argument_spec , supports_check_mode = True )
2017-02-15 19:59:03 +03:00
name = module . params . get ( ' name ' )
organization = module . params . get ( ' organization ' )
state = module . params . get ( ' state ' )
json_output = { ' credential ' : name , ' state ' : state }
tower_auth = tower_auth_config ( module )
with settings . runtime_values ( * * tower_auth ) :
tower_check_mode ( module )
credential = tower_cli . get_resource ( ' credential ' )
try :
2018-01-15 18:39:11 +03:00
params = { }
2017-02-15 19:59:03 +03:00
params [ ' create_on_missing ' ] = True
2018-01-15 18:39:11 +03:00
params [ ' name ' ] = name
2017-02-15 19:59:03 +03:00
if organization :
org_res = tower_cli . get_resource ( ' organization ' )
org = org_res . get ( name = organization )
params [ ' organization ' ] = org [ ' id ' ]
2018-02-26 21:12:54 +03:00
try :
tower_cli . get_resource ( ' credential_type ' )
2018-03-01 18:36:18 +03:00
except ( ImportError , AttributeError ) :
2018-02-26 21:12:54 +03:00
# /api/v1/ backwards compat
# older versions of tower-cli don't *have* a credential_type
# resource
params [ ' kind ' ] = module . params [ ' kind ' ]
else :
credential_type = credential_type_for_v1_kind ( module . params , module )
params [ ' credential_type ' ] = credential_type [ ' id ' ]
2018-01-15 18:39:11 +03:00
if module . params . get ( ' description ' ) :
params [ ' description ' ] = module . params . get ( ' description ' )
if module . params . get ( ' user ' ) :
user_res = tower_cli . get_resource ( ' user ' )
2018-02-22 19:23:38 +03:00
user = user_res . get ( username = module . params . get ( ' user ' ) )
2018-01-15 18:39:11 +03:00
params [ ' user ' ] = user [ ' id ' ]
if module . params . get ( ' team ' ) :
team_res = tower_cli . get_resource ( ' team ' )
team = team_res . get ( name = module . params . get ( ' team ' ) )
params [ ' team ' ] = team [ ' id ' ]
if module . params . get ( ' ssh_key_data ' ) :
2018-09-07 20:41:09 +03:00
data = module . params . get ( ' ssh_key_data ' )
if os . path . exists ( data ) :
module . deprecate (
msg = ' ssh_key_data should be a string, not a path to a file. Use lookup( \' file \' , \' /path/to/file \' ) instead ' ,
version = " 2.12 "
)
if os . path . isdir ( data ) :
module . fail_json ( msg = ' attempted to read contents of directory: %s ' % data )
with open ( data , ' rb ' ) as f :
module . params [ ' ssh_key_data ' ] = to_text ( f . read ( ) )
else :
module . params [ ' ssh_key_data ' ] = data
2018-03-16 20:28:19 +03:00
for key in ( ' authorize ' , ' authorize_password ' , ' client ' ,
' security_token ' , ' secret ' , ' tenant ' , ' subscription ' ,
' domain ' , ' become_method ' , ' become_username ' ,
' become_password ' , ' vault_password ' , ' project ' , ' host ' ,
' username ' , ' password ' , ' ssh_key_data ' ,
' ssh_key_unlock ' ) :
2018-03-01 23:22:29 +03:00
if ' kind ' in params :
params [ key ] = module . params . get ( key )
elif module . params . get ( key ) :
params . setdefault ( ' inputs ' , { } ) [ key ] = module . params . get ( key )
2017-02-15 19:59:03 +03:00
if state == ' present ' :
result = credential . modify ( * * params )
json_output [ ' id ' ] = result [ ' id ' ]
elif state == ' absent ' :
result = credential . delete ( * * params )
except ( exc . NotFound ) as excinfo :
module . fail_json ( msg = ' Failed to update credential, organization not found: {0} ' . format ( excinfo ) , changed = False )
except ( exc . ConnectionError , exc . BadRequest , exc . NotFound ) as excinfo :
module . fail_json ( msg = ' Failed to update credential: {0} ' . format ( excinfo ) , changed = False )
json_output [ ' changed ' ] = result [ ' changed ' ]
module . exit_json ( * * json_output )
if __name__ == ' __main__ ' :
main ( )