今兒個來說說關於ID設置這些事兒,以及碰到問題解決過程。希望對大家有用....
在前期主機名規劃當中,我們會根據業務特定設計出一套主機名識別方法。。
有一天,一臺測試機器安裝完畢,但在Saltstack認證key時,會發現master和minions對接時,發現minion傳過來的ID是localhost.localdomain,就奇怪了,這是爲什麼呢。?
默認主機操作系統安裝完畢,/etc/sysconfig/network配置文件的hostname是localhost.localdomain,當你在salt master和minion認證時(未顯示指定minion id情情況下),對端接受後,minion id一定是localhost.localdomain。。請看下面的認證過程
minion和master認證過程
1.minion在啓動時,會在/etc/salt/pki/minion下自動生成minion.pem和minion.pub,然後將minion.pub發送給master。
2.master在收到minion的public key,我們在通過salt-key -a允許minion key,這樣就會在master的/etc/salt/pki/master/minions下面存放以minion id命名的public key,此時認證通信已完成
上述認證過程不難發現,master是在收到minion傳過來的public key,然後以minion id爲其命名的。而有些的是localhost.localdomain,這是神馬原因呢。?
前期未在salt minion的配置文件中顯示指定minion id時,那將以默認值傳遞,那麼這個默認值是這麼得來的呢。?
在配置文件中有這麼一段話, if left commented the id will be the hostname as returned by the python call: socket.getfqdn(), 是通過socket.getfqdn()函數獲取而來。
那麼我們可以寫個小腳本來驗證fqdn
cat a.py #!/usr/bin/python env import socket print socket.getfqdn(socket.gethostname())
驗證
[roo@test-01 ~]# python a.py
localhost.localdomain
在執行腳本驗證時,發現FQDN不正確,這就需要重新配置Hostname #重現場景
Hostname配置方法
1. /etc/sysconfig/network
NETWORK = XXXX
配置完畢,重新network服務
2./etc/hosts,做映射
內網IP HOST
hostname -f進行驗證fqdn,在執行a.py腳本驗證,在刪除緩存minion_id(爲什麼請看下面)
這裏又碰到個小問題,在未重新配置hostname而直接連接salt master,傳過去的key會是localhost.localdomain,這個時候你重新設置完hostname,從master上刪除localhost.localdomain這個ID,再認證永遠都是這個id,除非你強制指定id(minion端配置文件的ID項)。爲什麼呢.? 我們來看下minion啓動過程
第二行,他使用了cache的minion id, minion在啓動時會生成一個id文件,這個文件就在/etc/salt/minion_id,然後會加載進cache,每次重啓都會讀取這個,這就是爲什麼永遠是localhost.localdomian id的原因
文件內容爲
cat /etc/salt/minion_id
localhost.localdomain
上述解決辦法,刪除minion id文件
minion# rm -f /etc/salt/minion_id
minion# /etc/salt/minion restart
重新認證,即可解決問題~~
好啦。關於id這個,碰到的問題都在這。。
推薦:在連接master時配置好Hostname,並能解析FQDN,再進行salt master認證;希望對你有幫助