Используйте Зашифрованный пароль для Cloudera Manager ApiResource вместо пароля в виде открытого текста - PullRequest
0 голосов
/ 30 апреля 2018

Я пытаюсь использовать зашифрованный пароль в скрипте Python для Cloudera Backup Disaster Recovery с использованием API Cloudera Manager.

Это - сценарий BDR (Создать код репликации), который я пытаюсь запустить: https://www.cloudera.com/documentation/enterprise/5-12-x/topics/cm_bdr_howto_api.html

import cm_api
import logging
from cm_api.api_client import ApiResource, ApiException, API_CURRENT_VERSION
from cm_api.endpoints.types import *
from cm_api.endpoints.services import ApiService

target_api = ApiResource(server_host="TARGET-CM-SERVER",version=18)
source_api = ApiResource(server_host="SOURCE-CM-SERVER",version=18)

# cluster = api.get_cluster("Cluster 1")
# cm_api.http_client = logging.basicConfig(level=logging.INFO)

# get hdfs service TARGET/SOURCE
target_cluster = target_api.get_cluster('REPLACE-ME-WITH-TARGET-CLUSTER-NAME')
target_hdfs = target_cluster.get_service('REPLACE-ME-WITH-TARGET-HDFS-NAME')
target_mr = target_cluster.get_service('REPLACE-ME-WITH-TARGET-YARN-NAME')

source_cluster = source_api.get_cluster('REPLACE-ME-WITH-SOURCE-CLUSTER-NAME')
source_hdfs = source_cluster.get_service('REPLACE-ME-WITH-SOURCE-CLUSTER-NAME')

peer = target_api.get_cloudera_manager().get_peer('REPLACE-ME-WITH-PEER-NAME-CONFIGURED-IN-TARGET-CLUSTER')

# setup replication schedule arguments
def hdfs_replication_schedule():
    # List of attributes: https://github.com/cloudera/cm_api/blob/master/python/src/cm_api/endpoints/types.py#L686-L708
    hdfs_args = ApiHdfsReplicationArguments(None)
    peer_name = peer.name
    hdfs_args.sourceService = ApiServiceRef(None, peerName=peer_name,
                                            clusterName=source_cluster.name,
                                            serviceName=source_hdfs.name)
    hdfs_args.numMaps = 20
    hdfs_args.dryRun = False
    hdfs_args.bandwidthPerMap = 100
    hdfs_args.abortOnError = False
    hdfs_args.removeMissingFiles = False
    hdfs_args.preserveReplicationCount = True
    hdfs_args.preserveBlockSize = True
    hdfs_args.preservePermissions = True
    hdfs_args.skipChecksumChecks = False
    hdfs_args.skipTrash = False
    hdfs_args.replicationStrategy = "DYNAMIC"
    hdfs_args.preserveXAttrs = False
    hdfs_args.exclusionFilters = []
    hdfs_args.sourcePath = '/tmp/src'
    hdfs_args.destinationPath = '/tmp/dest'
    hdfs_args.removeMissingFiles = False
    hdfs_args.userName = None
    hdfs_args.mapreduceServiceName = target_mr.name # YARN or MAPREDUCE

    return hdfs_args

schedule = target_hdfs.create_replication_schedule(start_time=None, end_time=None, interval_unit='MINUTE', interval=0, paused=False, arguments=hdfs_replication_schedule(), alert_on_start=False, 
alert_on_success=False, alert_on_fail=False, alert_on_abort=False)

# TRIGGER a schedule TO RUN
target_hdfs.trigger_replication_schedule(schedule.id)

Когда мне сложно кодировать пароль

(ApiResource(server_host="hostname",username="ugsk187",password="xyz",version=14,use_tls=True)), 

это работает. Но когда я пытаюсь присвоить переменную (var_passwprd = "xyz"), а затем передаю переменную в пароль

(ApiResource(server_host="hostname",username="ugsk187",password=var_passwprd,version=14,use_tls=True)), 

ниже выдает ошибку:

<code>Traceback (most recent call last): 
 File "test2.py", line 41, in <module> 
target_cluster = target_api.get_cluster('QA') 
File "/opt/pythonvirtual/bdr/lib/python2.7/site-
packages/cm_api/api_client.py", line 140, in get_cluster 
return clusters.get_cluster(self, name) 
File "/opt/pythonvirtual/bdr/lib/python2.7/site-
packages/cm_api/endpoints/clusters.py", line 57, in get_cluster 
return call(resource_root.get, "%s/%s" % (CLUSTERS_PATH, name), ApiCluster) 
File "/opt/pythonvirtual/bdr/lib/python2.7/site-
packages/cm_api/endpoints/types.py", line 139, in call 
ret = method(path, params=params) 
File "/opt/pythonvirtual/bdr/lib/python2.7/site-
packages/cm_api/resource.py", line 110, in get 
return self.invoke("GET", relpath, params) 
File "/opt/pythonvirtual/bdr/lib/python2.7/site-
packages/cm_api/resource.py", line 73, in invoke 
headers=headers) 
File "/opt/pythonvirtual/bdr/lib/python2.7/site-
packages/cm_api/http_client.py", line 183, in execute 
raise self._exc_class(ex) 
cm_api.api_client.ApiException: <html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/> 
<title>Error 401 Bad credentials</title> 
</head> 
<body><h2>HTTP ERROR 401</h2> 
<p>Problem accessing /api/v16/clusters/QA. Reason: 
<pre>    Bad credentials
<час /> Jetty: //


(ошибка 401)
...