Skip to content
31 July / Eric Chang / 筆記

# [筆記] 用pxe 安裝系統，完成後送出郵件通知 / send mail notification after pxe install
some articles about job,food,passion sisters

最近有個任務，需要大量安裝client

想用PXE來處理，只要user開機按F12(acer 桌機) 選擇PXE Boot

然後選擇OS版本，就可以自動進行安裝

安裝完成後，會自動重新開機，接著就用ansible來做user環境設定

PXE的部份本來是沒有什麼問題，自動安裝系統的部份都做好了

可是因為這次的量比較多，想說讓每一台在完成PXE安裝後的第一次重開機

就送出一封郵件來通知我，說已經完成安裝，可以執行ansible 了

看似很簡單的一件事情，卻搞了我兩天….

本來在 preseed 檔案中，就有 preseed/late_command 可以用

但是測試了很多遍，才終於找到正確的語法

    d-i preseed/late_command \
            in-target apt-file update; \
            in-target passwd --expire root  ;\
            in-target /bin/sh -c 'echo "hostname|mail -s pxe_install_complete admin@abc.com" > /etc/rc.local'

這會把目標主機上的 /etc/rc.local 的內容改成只有一行

    hostname|mail -s pxe_install_complete admin@abc.com

這樣就可以讓主機在完成系統安裝後，第一次重新開機時，送出郵件通知

可是呢，因為ubuntu 開機時，本來就會去執行 /etc/rc.local

所以「每次」開機後，都會送出郵件通知

但是我只想要接到一次通知就好了啊

有文章說可以用 s6-svc 來處理

不過我沒弄懂怎麼用

另一個是用ansible來處理

又或者是，讓這個指令在送出郵件後，「自我還原」或者「自我更新」

自我還原的部份可以這樣做

    hostname|mail -s pxe_install_complete admin@abc.com
    echo "#!/bin/sh -e\nexit 0" > /etc/rc.local

所以preseed 那邊的語法就要改一下

      in-target /bin/sh -c 'echo "hostname|mail -s pxe_install_complete admin@abc.com;\"exit 0\" > /etc/rc.local'

這樣一來，在送出郵件後，/etc/rc.local 的檔案內容會被恢復成只有底下這一行

    exit 0

暫時先這樣子處理

### 更新

因為直接把 /etc/rc.local 的內容改掉，實在讓我有點不放心

所以想到一個方式，先備份 /etc/rc.local 然後加入我要的功能

因為我只需要它跑一次就好，所以就可以在最後面加入還原剛剛複製的備份檔案

簡單說在preseed 檔案中 改成這樣

    d-i preseed/late_command \
            in-target apt-file update; \
            in-target passwd --expire root  ;\
            in-target cp /etc/rc.local /etc/rc.local.bak ;\
            in-target /bin/sh -c 'echo "hostname|mail -s pxe_install_complete admin@abc.com" > /etc/rc.local' ;\
            in-target /bin/sh -c 'echo "cp /etc/rc.local.bak /etc/rc.local" >> /etc/rc.local'

在開機之後，會先送出郵件通知，然後會把剛剛複製的備份覆蓋回來，變成原本的 rc.local

這樣就不會有什麼問題了

Categories 筆記

Tags PXE ubuntu linux

Written by:Eric Chang

塵世裡一個迷途小書僮

comments powered by Disqus