“ ambari自定義服務乾貨,非常乾的那種”
聲明:博主寫了一些Ambari系列文章,可以在歷史文章中查看。 仔細看,肯定會對ambari的自定義服務有一個更清晰的認識。 版本:ambari 2.6.1
一、實時更改服務配置
# 以hue的配置文件hue.ini爲例 File(format("/usr/hdp/2.6.4.0-91/hue/desktop/conf/hue.ini"), content=Template("hue.ini.j2"), owner=params.hue_user, group=params.hue_group ) # 解讀: # 1. File的第一個變量爲:實際服務的配置文件的所在地 # 2. File的第二個變量爲:在服務的./package/目錄下新建templates文件夾,該文件夾下放入hue.ini.j2文件,與配置文件hue.ini內容一致。 # 3. File的第三個變量爲:所有者爲hue # 4. File的第四個變量爲: 所在組爲hue
變量以{% raw %}{{}}{% endraw %}括起來,變量定義在 param.py
文件。
# param.py局部 from resource_management.libraries.script.script import Script config = Script.get_config() http_host = config['hostname'] http_port = config['configurations']['hue-env']['http_port'] # 其中的'configurations'是代表着ambari集羣已安裝組件的所有xml配置文件 # 'hue-env'對應着 configuration/hue-env.xml
hue-env.xml文件
目錄:configuration/hue-env.xml
這樣的話,當在ambari界面上的hue服務那修改配置,後臺根據config命令來讀取前端修改的值,然後賦值於 hue.ini.j2
, hue.ini.j2
又與 hue.ini
相關聯。這樣,hue的配置文件就會被實時更改,然後在ambari界面上根據提示重啓hue服務,配置即可生效。
二、py腳本內創建/刪除文件夾、文件
2.1 創建文件夾、文件
def start(self, env): import params env.set_params(params) Directory([params.hue_pid_dir], mode=0755, cd_access='a', owner=params.hue_user, group=params.hue_group, create_parents=True ) File([params.hue_log_file, params.hue_server_pid_file], mode=0644, owner=params.hue_user, group=params.hue_group, content='' ) # 說明 # import導入params.py文件,該文件內有上面用到的‘hue_pid_dir’,‘hue_log_file’,‘hue_server_pid_file’變量的定義 # Directory表示執行文件夾操作,[]括起來的是要創建的文件夾名稱,mode是權限,owner/group是用戶/組,create_parents=True是父目錄不存在時一起創建。 # create_parents=True 有待驗證。 # File表示執行文件操作,[]括起來的是要創建的文件名稱,mode是權限,owner/group是用戶/組,content=''代表內容爲空。
2.2 刪除文件夾/文件
def stop(self, env): import params env.set_params(params) Directory(params.hue_pid_dir, action="delete", owner=params.hue_user ) # 說明 # Directory表示執行文件夾操作,第一個參數爲執行操作的文件夾名稱,action="delete"代表刪除,owner代表由哪個用戶執行操作。 # File同理
2.3 設置密碼校驗
<property require-input="true"> <name>kadmin.local.password</name> <display-name>admin password</display-name> <value/> <property-type>PASSWORD</property-type> <description>The password is used to add the kerberos database administrator</description> <value-attributes> <overridable>false</overridable> <type>password</type> </value-attributes> </property>
效果圖:
三、依賴包說明
自定義服務python腳本依賴的模塊是 resource_management
,該模塊的位置在 /usr/lib/ambari-agent/lib/resource_management
,ambari的自定義服務程序環境就是依賴的這個目錄。
四、調試代碼邏輯,如何打印日誌
from resource_management.core.logger import Logger Logger.info("Starting sample Service")
五、如何獲取集羣已有服務組件所在主機
1. 獲取ambari-server所在的主機,即主節點
from resource_management.libraries.script.script import Script config = Script.get_config() ambari_server_hostname = config['clusterHostInfo']['ambari_server_host'][0]
2. 獲取集羣名稱
cluster_name = str(config['clusterName'])
3. 獲取當前主機名稱
hostname = config['hostname']
4. 獲取已安裝服務組件所在主機
clusterHostInfo = config['clusterHostInfo'] ## 返回的clusterHostInfo是一個數組,我們用”,”將其分割爲字符串,來看一下里面是什麼 clusterHostInfo = ",".join(params.clusterHostInfo) ## clusterHostInfo 的值爲: snamenode_host,nm_hosts,metrics_collector_hosts,hive_metastore_host,ranger_tagsync_hosts,elasticsearch_service_hosts,ranger_usersync_hosts,slave_hosts,spark_jobhistoryserver_hosts,mymaster_hosts,infra_solr_hosts,hive_server_host,hue_server_hosts,hbase_rs_hosts,webhcat_server_host,ranger_admin_hosts,ambari_server_host,zookeeper_hosts,mysalve_hosts,spark_thriftserver_hosts,app_timeline_server_hosts,livy_server_hosts,all_ping_ports,rm_host,all_hosts,ambari_server_use_ssl,metrics_monitor_hosts,oozie_server,all_racks,all_ipv4_ips,hs_host,metrics_grafana_hosts,phoenix_query_server_hosts,ambari_server_port,namenode_host,hbase_master_hosts ## 解析:上述格式爲:component_name_hosts ## 假如我們需要查看namenode所在的主機,需要怎麼做呢? namenode = config['clusterHostInfo']['nm_hosts'] ## 或者 namenode = default("/clusterHostInfo/nm_hosts", [“localhost”]) ## 上面這行代碼的意思是,如果nm_hosts不存在,則以localhost代替。可見,default這種方法比config的那種方法要更全面。 ## 注意:以上namenode是一個數組,所以我們需要再做進一步處理,這裏就不再進行demo演示了
5. 獲取ambari系統內其它已安裝服務的xml屬性值
configurations = config['configurations'] configurations = ",".join(configurations) ## configurations 的值爲: spark-defaults,livy-log4j-properties,ranger-hdfs-audit,webhcat-log4j,ranger-yarn-plugin-properties,ranger-hdfs-policymgr-ssl,pig-env,hue-hive-site,hdfs-logsearch-conf,slider-env,ranger-hive-policymgr-ssl,hivemetastore-site,llap-cli-log4j2,spark-hive-site-override,ranger-hive-security,spark-log4j-properties,ams-logsearch-conf,ams-hbase-security-site,oozie-env,mapred-site,hue-mysql-site,spark-env,hdfs-site,hue-hadoop-site,ams-env,ams-site,ams-hbase-policy,zookeeper-log4j,hadoop-metrics2.properties,hue-env,hdfs-log4j,hbase-site,ranger-hbase-plugin-properties,ams-log4j,ranger-yarn-audit,hive-interactive-env,ranger-hdfs-plugin-properties,hue-pig-site,pig-properties,oozie-log4j,hawq-limits-env,oozie-logsearch-conf,ams-hbase-site,hive-env,ams-hbase-log4j,hadoop-env,hue-solr-site,hive-logsearch-conf,tez-interactive-site,yarn-site,parquet-logging,hive-exec-log4j,webhcat-site,sqoop-site,hawq-sysctl-env,hive-log4j,ranger-hdfs-security,hiveserver2-site,sqoop-atlas-application.properties,mapred-env,ranger-hive-audit,ranger-hbase-security,slider-client,ssl-client,sqoop-env,livy-conf,ams-grafana-env,ranger-yarn-policymgr-ssl,ranger-hbase-audit,livy-env,hive-log4j2,hive-site,spark-logsearch-conf,spark-javaopts-properties,ams-ssl-client,yarn-client,hbase-policy,webhcat-env,hive-atlas-application.properties,hue-ugsync-site,hcat-env,tez-site,slider-log4j,spark-thrift-sparkconf,spark-thrift-fairscheduler,hue-hbase-site,mapred-logsearch-conf,yarn-log4j,hue-oozie-site,ams-grafana-ini,livy-spark-blacklist,hadoop-policy,ranger-hive-plugin-properties,ams-ssl-server,tez-env,hive-interactive-site,hawq-env,ams-hbase-env,core-site,yarn-env,hawq-site,spark-metrics-properties,hbase-logsearch-conf,hue-desktop-site,hdfs-client,yarn-logsearch-conf,zookeeper-logsearch-conf,beeline-log4j2,hiveserver2-interactive-site,ranger-yarn-security,capacity-scheduler,hbase-log4j,oozie-site,ssl-server,llap-daemon-log4j,hbase-env,hawq-check-env,zoo.cfg,ranger-hbase-policymgr-ssl,hue-spark-site,hive-exec-log4j2,zookeeper-env,pig-log4j,cluster-env ## 例如,我要獲取oozie-site.xml內oozie.base.url的值 oozie_url = config['configurations']['oozie-site']['oozie.base.url']
6. 獲取當前安裝hdp的版本
hdp_version = default("/commandParams/version", None) # 說明:返回結果爲2.6.4.0-91,如果沒有/commandParams/version的話,結果返回None
7. 一些特殊約定
tmp_dir = Script.get_tmp_dir() # 結果:/var/lib/ambari-agent/tmp
六、config補充
config = Script.get_config() ## 打印config,內容如下: agentConfigParams,credentialStoreEnabled,taskId,configurations,clusterName,localComponents,commandType,configuration_attributes,repositoryFile,roleParams,public_hostname,configurationTags,commandId,roleCommand,configuration_credentials,commandParams,componentVersionMap,hostname,hostLevelParams,kerberosCommandParams,serviceName,role,forceRefreshConfigTagsBeforeExecution,stageId,clusterHostInfo,requestId
如果需要看 agentConfigParams
裏面有什麼 key
值,可以參考標題四使用 Logger.info
打印,比如:
# 如果是數組的話,就以“,”分隔 Logger.info(",".join(config['configurations'])) # 如果是字符串就直接打印出來 Logger.info(config['configurations'])
更多精彩乾貨內容,請關注微信公衆號實時查看
內容持續更新中,點擊閱讀全文獲取文章的最新內容