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
略