新作的centos7.4鏡像的cloud-init安裝好以後,修改密碼失敗,可是一樣的配置文件在7.2上的是正常的,對比了一下版本,centos7.4上的是0.7.9,7.2上的是0.7.5,通過調試發現是0.7.9版本的cloud-init有bug致使的,發現問題以後經過降級到0.7.5版本解決。以前也加斷點調試過幾回,但沒有記錄下來,這裏記錄下調試方法,由於默認直接加pdb斷點是無法調試的。python
首先要知道如何手工運行cloud-init工具,能夠命令行執行: cloud-init -h ,看到有多個命令供選擇,但咱們只須要執行 cloud-init init 命令和 cloud-init init --local 命令便可,這兩個命令就是開機自啓動服務中會執行的,差別就是 --local 僅讀取本地數據源(如config drive數據源),不加這個參數,可能嘗試讀取EC2等網絡數據源(http://169.254.169.254)。centos
執行的時候要注意,cloud-init不少操做都是默認僅第一次開機的時候執行的(once-per-instance),也就是說默認狀況下,每一個雲主機僅在第一次建立後啓動的時候執行一次初始化操做,後面不管你怎麼重啓都不會執行的(固然不是所有初始化操做都不執行,要看具體的配置,但絕大部分操做都是once-per-instance)。因此爲了保證每次手工執行的時候,都執行全部初始化操做,能夠手工刪除cloud-init的緩存目錄,cloud-init是根據緩存中的雲主機id(instance-id,通常就是雲主機uuid)和數據源中獲取的id來對比,確認是不是新建雲主機第一次啓動的。該緩存目錄通常位於(/var/lib/cloud),直接刪除整個目錄便可清空緩存,調試過程當中每次執行cloud-init命令前都須要刪除一次。緩存
直接加pdb斷點到源碼裏是沒法調試的,由於cloud-init會重定向標準輸入stdin,因此還要註釋掉這行代碼才行:網絡
try: 174 LOG.debug("Closing stdin") 175 #util.close_stdin() ########### 註釋掉這行 176 (outfmt, errfmt) = util.fixup_output(init.cfg, name) 177 except Exception: 178 util.logexc(LOG, "Failed to setup output redirection!") 179 print_exc("Failed to setup output redirection!")
上面是cloud-init init命令須要註釋掉代碼的示例(基於0.7.9版本源碼,0.7.5版本的入口在/usr/bin/cloud-init或者/bin/cloud-init,可以使用 which cloud-init 命令查看具體路徑,須要在這個文件裏註釋掉這行代碼),若是你要調試其餘命令如cloud-init modules還有其餘地方須要註釋:python2.7
$:/usr/lib/python2.7/site-packages/cloudinit/cmd# grep -rn stdin main.py ### (基於0.7.9版本,0.7.5的是/usr/bin/cloud-init) 174: LOG.debug("Closing stdin") 175: util.close_stdin() 356: LOG.debug("Closing stdin") 357: util.close_stdin() 419: LOG.debug("Closing stdin") 420: util.close_stdin()
以後在main_init方法的入口處加入斷點(0.7.5的不加會進入不了調試模式,0.7.9的能夠不加,爲了保險,能夠加上,而後執行c命令跳到你真正想調試的斷點處便可),而後再在你想要的任何地方加斷點便可調試。工具
170 # Stage 2 171 outfmt = None 172 errfmt = None 173 import pdb;pdb.set_trace() ### 加入pdb斷點 174 try: 175 LOG.debug("Closing stdin") 176 #util.close_stdin() ########### 註釋掉這行 177 (outfmt, errfmt) = util.fixup_output(init.cfg, name) 178 except Exception: 179 util.logexc(LOG, "Failed to setup output redirection!") 180 print_exc("Failed to setup output redirection!")