相信大家對這個畫面都不陌生:
除了 MySQL 5.7 的某幾個版本會自動產生 root 的 password 以外,大多都是在安裝時讓使用者自行輸入密碼。
但今天你不是手動安裝,而是寫 script 讓主機自行部屬,這下就麻煩了,因為你不可能每台主機都人工輸入密碼,另外像是 AWS 自動部屬的話,你大概連 console 都沒有。但若透過 debconf 是有機會做到完全自動安裝。
首先來安裝 debconf:
sudo apt-get install debconf
稍等為了讓大家看一下 deb 的 interactive mode 是怎麼撰寫的,在安裝 ar 套件:
sudo apt-get install binutils
今天要被我拿來操刀的是「mysql-community-server_5.7.27-1ubuntu18.04_amd64.deb」。先用 ar 把 deb 檔解開,可以看到同下方的檔案:
$ ls
control.tar.xz data.tar.xz debian-binary
這邊要解壓縮「tar xvf control.tar.xz」,解開後會多出幾個檔案:
$ ls
conffiles config control debian-binary postinst postrm preinst prerm templates
這邊只專注於「config」檔,其他檔案先不管。開啟「config」檔以後,大概可以看到幾個關鍵字,像是:
- db_input
- db_get
- db_fset
- mysql-community-server/root-pass
這幾個關鍵字和整個 shell script 就是用來和使用者互動的指令,也就是最上面看到的那張圖。經由 db_set + variable-name 就可以暫存使用者輸入的資料,接下來就透過這幾個變數來動手腳。
先告知 debconf 不使用互動的方式來安裝 deb:
export DEBIAN_FRONTEND="noninteractive"
既然沒有和使用者互動,理當不會有 root 密碼,但可透過「debconf-set-selections」的方式來幫 package 設定:
debconf-set-selections <<< "mysql-community-server/root-pass password root"
之後安裝時就不會出現使用者輸入提示視窗了:
dpkg -i mysql-community-server_5.7.27-1ubuntu18.04_amd64.deb
apt-get install -f # 安裝需要的 dependedncy
apt --fix-broken -y install