0520-如何使用非root用戶啟動CM的Server和Agent服務
- 2019 年 11 月 27 日
- 筆記
1
文檔編寫目的
根據前面的安裝文檔,我們知道CDH的安裝只能使用root或者具有sudo許可權的用戶進行安裝,但大多數企業對於伺服器的root用戶的管控比較嚴格,大多數情況下都不能夠直接使用或者需要申請比較麻煩。對於這種情況,Cloudera官方提供了一種單用戶安裝CDH的模式,參考Fayson前面的文章《0517-如何在CDH5中使用單用戶模式》。但實際情況是這種方法非常麻煩,官方其實也不建議使用,而且從CDH6開始也已經廢棄了這種安裝或使用方式。
本文基於一個實際需求,即CDH相關的所有服務都使用非root用戶來管理,主要是Cloudera Manager Server和Agent服務(其他Hadoop服務默認都是使用相應自己的用戶比如hdfs或者hive用戶),我們知道這2個服務默認會被放到作業系統的/etc/rc.d/init.d下,即會開機自啟動,而且Server使用cloudera-scm用戶啟動而Agent使用root用戶啟動。實現思路是先從作業系統自啟動里移除,然後設置相關腳本,文件和日誌的許可權來實現使用非root用戶的手動啟動,這樣可以實現未來的非root用戶來管理Server和Agent服務,而Hadoop相關服務大部分情況下都可以通過Cloudera Manager介面化來管理。以下Fayson進行實操演示。
- 測試環境
1.CDH5.16.1
2.Redhat7.4
3.採用root進行操作
2
修改cloudera-scm-agent服務
2.1
移除agent服務
1.停止Agent服務
systemctl stop cloudera-scm-agent
2.Kill supervisord進程,如果存在
[root@ip-172-31-13-38 ~]# ps -ef |grep supervisord root 1470 1 0 12:39 ? 00:00:11 /usr/lib64/cmf/agent/build/env/bin/python /usr/lib64/cmf/agent/build/env/bin/supervisord root 14521 13742 0 13:09 pts/0 00:00:00 grep --color=auto supervisord [root@ip-172-31-13-38 ~]# kill 1470 [root@ip-172-31-13-38 ~]#

3.將/etc/rc.d/init.d/cloudera-scm-agent腳本移到/root/agent_bak下:
[root@ip-172-31-13-38 ~]# mkdir agent_bak [root@ip-172-31-13-38 ~]# cd /etc/rc.d/init.d/ [root@ip-172-31-13-38 init.d]# mv cloudera-scm-agent /root/agent_bak/

4.重載systemd服務,並確認agent服務已經被移除。
[root@ip-172-31-13-38 init.d]# systemctl daemon-reload [root@ip-172-31-13-38 init.d]# systemctl start cloudera-scm-agent Failed to start cloudera-scm-agent.service: Unit not found. [root@ip-172-31-13-38 init.d]#

2.2
修改啟動腳本
1.修改啟動腳本cloudera-scm-agent

我們編輯cloudera-scm-agent腳本,可以看到如上圖一行的啟動命令,標紅部分為當用戶啟動cloudera-scm-agent時,會su root來執行該腳本,這也是為什麼我們看到的cloudera-scm-agent服務的啟動用戶是root的原因。因為我們現在要演示用其他用戶啟動該腳本,所以刪掉這部分,然後保存。

2.修改文件夾屬組,這裡我們計劃使用cloudera-scm用戶來啟動agent服務
chown cloudera-scm:cloudera-scm /var/log/cloudera-scm-agent/* chown -R cloudera-scm:cloudera-scm /var/run/cloudera-scm-agent

2.3
手動啟動agent服務
1.手動啟動agent服務
sudo -u cloudera-scm sh cloudera-scm-agent start

2.查看CM頁面可以檢測到該agent的心跳

3.但是發現該節點上的CMS和Hadoop相關服務顯示異常。

4.重啟CMS服務


重啟失敗
5.重啟172.31.13.38節點上的NameNode服務,報錯如下
Error found before invoking supervisord: Non-root agent cannot execute process as user 'hdfs'

3
修改cloudera-scm-server服務
3.1
停止server服務
1.停止cloudera-scm-server服務
systemctl stop cloudera-scm-server
2.將/etc/rc.d/init.d/cloudera-scm-server腳本移到/root/agent_bak下:
[root@ip-172-31-13-38 ~]# cd /etc/rc.d/init.d [root@ip-172-31-13-38 init.d]# mv cloudera-scm-server /root/bak

3.重載systemd服務,並確認server服務已經被移除。
[root@ip-172-31-13-38 init.d]# systemctl daemon-reload You have new mail in /var/spool/mail/root [root@ip-172-31-13-38 init.d]# systemctl start cloudera-scm-server Failed to start cloudera-scm-server.service: Unit not found. [root@ip-172-31-13-38 init.d]#

4.修改相應目錄的許可權
chown cloudera-scm:cloudera-scm /var/log/cloudera-scm-server/*
3.2
手動啟動server服務
1.使用cloudera-scm用戶啟動Cloudera Manager Server服務
[root@ip-172-31-13-38 bak]# sudo -u cloudera-scm sh cloudera-scm-server start Starting cloudera-scm-server: cloudera-scm-server: line 249: /var/run/cloudera-scm-server.pid: Permission denied [FAILED] [root@ip-172-31-13-38 bak]#

啟動失敗,這裡報錯是/var/run的許可權,這個目錄會掛載到/run下,修改這個目錄的許可權後可以啟動成功,但是重啟系統之後,該目錄的許可權又會還原,最終還是失敗。
4
總結
1.本文Fayson嘗試手動做一些修改後,使用非root用戶來啟停server和agent服務,都以失敗告終。
2.Agent服務可以配置為使用別的用戶來啟動,本文是使用cloudera-scm,但是帶來的問題是該節點上的CMS服務或者Hadoop相關服務無法管理,因為CM管理節點的原理是通過通過向agent發送相關指令,然後通過agent的用戶root來sudo到相關的的組件用戶來管理相應的服務,比如sudo到hdfs用戶來管理HDFS服務,實際還有CM搜集診斷包也需要通過agent調用很多系統命令來進行搜集。本文其實可以通過配置其他用戶比如cloudera-scm用戶的免密sudo到其他用戶來進行嘗試,但是沒有再這麼做的原因是因為agent管理服務或者調用作業系統本身的系統命令太多,逐項配置是非常麻煩的基本不現實,具體可以參考《0517-如何在CDH5中使用單用戶模式》。
3.Server服務主要是因為/var/run目錄的許可權問題,我們可以臨時修改該目錄的許可權來實現。但因為/var/run最終會掛載到OS的記憶體系統tmpfs中,一旦重啟OS,該目錄又會還原,又需要手動設置。
4.綜上所述,無論是Cloudera Manager Server還是Agent服務都無法配置為其他用戶來啟停,只能通過root用戶來管理。
5.其實這2個服務如果你配置為其他用戶來管理,也不是官方支援的方式,所以無論從技術可行性還是能否享受正式支援的角度來說,都不建議去修改Server和Agent的啟停用戶。