salt master常見的故障分析方法
RUNNING IN THE FOREGROUND
運行salt-master -l debug或者在前台運行,不使用-d選項
WHAT PORTS DOES THE MASTER NEED OPEN?
檢查運行的端口是否正常
默認是tcp的4505和4506,確認這兩個端口運行正常,且沒有防火牆的限制和selinux限制,其次有沒有其他訪問控制的限制。
TOO MANY OPEN FILES
當minion端連接master端的時候,至少會建立兩個TCP鏈接,當minion端過多的時候會導致一下情況產生:

1 12:45:29,289 [salt.master ][INFO ] Starting Salt worker process 38 2 Too many open files 3 sock != -1 (tcp_listener.cpp:335)
檢查:ulimit -n
設置方法:
創建文件/etc/security/limits.d/99-salt.conf

1 root hard nofile 4096 2 root soft nofile 4096
如果系統沒有limit.d這個目錄,那就添加limit限制文件/etc/security/limits.conf
檢查是否設置成功:
打開另一個shell使用ulimit -n查看是否修改成功,如果修改不生效可以使用以下辦法
在/etc/default/salt-master文件中增加limit nofile 4096 4096內容
SALT MASTER STOPS RESPONDING
master端安裝的ZeroMQ版本小於2.1.11會導致不響應的情況,你可以通過設置一些參數來解決這個問題
# echo 16777216 > /proc/sys/net/core/rmem_max
# echo 16777216 > /proc/sys/net/core/wmem_max
# echo "4096 87380 16777216" > /proc/sys/net/ipv4/tcp_rmem
# echo "4096 87380 16777216" > /proc/sys/net/ipv4/tcp_wmem
LIVE PYTHON DEBUG OUTPUT
在線調試
如果master端響應比較遲鈍,可以使用SIGUSR1信號查看當前正在執行那些任務代碼
首先確保saltmaster在前台運行:
# salt-master -l debug
# killall -SIGUSR1 salt-master
LIVE SALT-MASTER PROFILING
分析salt-master
# killall -SIGUSR2 salt-master
可以實現在線分析,執行上述代碼之后將進行分析,並保存到文件中,最后再次發送一遍這樣的信號,終止分析。
COMMANDS TIME OUT OR DO NOT RETURN OUTPUT
命令執行超時或沒有輸出返回
默認master端是有一個超時時間的設置,默認是5秒鍾,可配置
/etc/salt/master
PASSING THE -C OPTION TO SALT RETURNS A PERMISSIONS ERROR
salt master啟動的時候可以使用-c指定配置的路徑,也可以通過root_dir的配置,配置的內容包含pki_dir, cachedir,sock_dir, log_file, autosign_file, autoreject_file, extension_modules,key_logfile, pidfile這些內容。
SALT MASTER DOESN'T RETURN ANYTHING WHILE RUNNING JOBS
當一個jobs需要執行很長時間的時候,這時候saltmaster會達到超時時間后返回到shell,這時候可以使用-t選項覆蓋默認的超時時間,超時時間可以在master主配置文件中設置。
SALT MASTER AUTH FLOODING
salt master認證洪泛
在大的集群環境下,為了保證master服務器不被大量的認證信息消耗過多資源,這時候你需要合理的配置minion端的認證

1 recon_default: 2 重新連接嘗試之間等待的平均秒數。 3 recon_max: 4 重新連接嘗試之間等待的最大秒數。 5 recon_randomize: 6 是否進行隨機的認證 7 acceptance_wait_time: 8 等待每個身份驗證請求回復的秒數。 9 random_reauth_delay: 10 隨機化的身份驗證 11 auth_timeout: 12 認證的超時時間,不管嘗試的次數
RUNNING STATE LOCALLY
調試state文件
salt-call -l trace --local state.highstate
-l trace
設置output級別
SALT MASTER UMASK
umask文件默認權限值,如果設置不當會導致master訪問緩存文件失敗,顯示權限錯誤。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
TROUBLESHOOTING THE SALT MINION
minion端的故障排查
RUNNING IN THE FOREGROUND
# salt-minion -l debug
WHAT PORTS DOES THE MINION NEED OPEN?
檢查端口的運行,需要安裝netcat,使用nc命令探測端口
$ nc -v -z salt.master.ip.addr 4505
Connection to salt.master.ip.addr 4505 port [tcp/unknown] succeeded!
$ nc -v -z salt.master.ip.addr 4506
Connection to salt.master.ip.addr 4506 port [tcp/unknown] succeeded!
也可以通過nmap來檢查
nmap -sS -q -p 4505-4506 salt.master.ip.addr
在檢查與master端口連通性的同時,我們不能忽略有防火牆selinux的影響,這時候我們可以使用tcptraceroute盡量排查
關於tcptraceroute的使用說明:https://linux.die.net/man/1/tcptraceroute
USING SALT-CALL
salt-call最初設計是為了運行和調試自有編寫的模塊,在minion端運行
# salt-call -l debug state.apply
LIVE PYTHON DEBUG OUTPUT
# salt-minion -l debug
# killall -SIGUSR1 salt-minion
MULTIPROCESSING IN EXECUTION MODULES
暫不了解
SALT MINION DOESN'T RETURN ANYTHING WHILE RUNNING JOBS LOCALLY
minion端的任務超時時間設置,可以使用-t設置,也可以配置/etc/salt/minion里面的timeout
SALT AND SELINUX
暫不了解
COMMON YAML GOTCHAS
yaml的常見錯誤,yaml用於序列化sls里面的數據
SPACES VS TABS
在yaml里面不要使用tab,可以在vim里面啟動搜索高亮:set hlsearch,使用:set tabstop=2 expandtab將tab去掉
INDENTATION
NESTED DICTIONARIES
file.managed里面使用context和default選項:
/etc/http/conf/http.conf:

1 file: 2 - managed 3 - source: salt://apache/http.conf 4 - user: root 5 - group: root 6 - mode: 644 7 - template: jinja 8 - context: 9 custom_var: "override" 10 - defaults: 11 custom_var: "default value" 12 other_var: 123
context:定義配置文件中的內容變量
defaults:定義變量的默認值
這兩個選項可以包含一個字典:
/etc/http/conf/http.conf:

1 file: 2 - managed 3 - source: salt://apache/http.conf 4 - user: root 5 - group: root 6 - mode: 644 7 - template: jinja 8 - context: { 9 custom_var: "override" } 10 - defaults: { 11 custom_var: "default value", 12 other_var: 123 }
下面是一個更具體的例子,它更加清晰的展示了yaml的數據結構:

1 >>> import yaml 2 >>> yaml.safe_load('''mystate: 3 ... file.managed: 4 ... - context: 5 ... some: var''') 6 {'mystate': {'file.managed': [{'context': {'some': 'var'}}]}} 7 >>> yaml.safe_load('''mystate: 8 ... file.managed: 9 ... - context: 10 ... some: var''') 11 {'mystate': {'file.managed': [{'some': 'var', 'context': None}]}}
TRUE/FALSE, YES/NO, ON/OFF
特殊符號的處理
示例:

1 - '"false"' 2 - "'True'" 3 - "'YES'" 4 - '"No"'
THE '%' SIGN
%對於yaml具有特殊意義

1 cheese: 2 ssh_auth.present: 3 - user: tbortels 4 - source: salt://ssh_keys/chease.pub 5 - config: '%h/.ssh/authorized_keys'
TIME EXPRESSIONS
load_yaml示例:

1 {% load_yaml as wsus_schedule %} 2 3 FRI_10: 4 time: '"23:00"' 5 day: 6 - Every Friday 6 SAT_10: 7 time: '"06:00"' 8 day: 7 - Every Saturday 9 SAT_20: 10 time: '"14:00"' 11 day: 7 - Every Saturday 12 SAT_30: 13 time: '"22:00"' 14 day: 7 - Every Saturday 15 SUN_10: 16 time: '"06:00"' 17 day: 1 - Every Sunday 18 {% endload %}
YAML DOES NOT LIKE "DOUBLE SHORT DECS"
yaml不接受Double Short Decs
一個Double Short Decs的示例

1 vim: 2 pkg.installed 3 user.present
正確的寫法是這樣的,不管有沒有參數,都必須被定義:

1 vim: 2 pkg.installed: [] 3 user.present: [] 4 5 fred: 6 user.present: [] 7 ssh_auth.present: 8 - name: AAAAB3NzaC... 9 - user: fred 10 - enc: ssh-dss 11 - require: 12 - user: fred
YAML SUPPORT ONLY PLAIN ASCII
YAML僅支持ASCII
可以使用shell命令找到sls文件中的非ASCII字符
find . -name '*.sls' -exec grep --color='auto' -P -n '[^\x00-\x7F]' \{} \;
UNDERSCORES STRIPPED IN INTEGER DEFINITIONS
yaml解釋數字和下划線時是剝離的

1 >>> import yaml 2 >>> yaml.safe_load('2013_05_10') 3 20130510 4 >>> yaml.safe_load('"2013_05_10"') 5 '2013_05_10'
AUTOMATIC DATETIME CONVERSION
略