salt运行时遇到的常见的问题

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

时间: 2024-08-14 23:28:12

salt运行时遇到的常见的问题的相关文章

docker 运行时常见错误

docker 运行时常见错误 (1) Cannot connect to the Docker daemon at unix:///var/run/docker.sock. [[email protected] geo]# docker version Client: Docker Engine - Community Version: 19.03.8 API version: 1.40 Go version: go1.12.17 Git commit: afacb8b Built: Wed M

使用Visual VM监控运行时的项目

1.1 Visual VM简介 VisualVM 提供在 Java 虚拟机 (Java Virutal Machine, JVM) 上运行的 Java 应用程序的详细信息.在 VisualVM 的图形用户界面中,您可以方便.快捷地查看多个 Java 应用程序的相关信息.(摘自官方) 简单说来,VisualVM是一种集成了多个JDK命令行工具的可视化工具,它能为您提供强大的分析能力.所有这些都是免费的!它囊括的命令行工具包括jstat, JConsole, jstack, jmap 和 jinfo

内存的划分 & 程序代码运行时内存工作流程

内存的划分: 1,寄存器. 2,本地方法区. 3,方法区. 4,栈内存. 存储的都是局部变量. 而且变量所属的作用域一旦结束,该变量就自动释放. 5,堆内存. 存储是数组和对象(其实数组就是对象) ,凡是new建立的都在堆中. 特点: 1)每一个实体都有首地址值. 2)堆内存中的每一个变量都有默认初始化值,根据类型的不同而不同.整数是0,小数0.0或者0.0f,boolean类型是false,char类型是 '\u0000',引用数据类型是NULL 3)垃圾回收机制. 全局变量和局部变量的区别:

iOS运行时 -- Runtime(摘抄自网络)

运行时(iOS) 一.什么是运行时(Runtime)? 运行时是苹果提供的纯C语言的开发库(运行时是一种非常牛逼.开发中经常用到的底层技术) 二.运行时的作用? 能获得某个类的所有成员变量 能获得某个类的所有属性 能获得某个类的所有方法 交换方法实现 能动态添加一个成员变量 能动态添加一个属性 能动态添加一个方法 三.案例:运行时获取成员变量名称 1.分析 #import <Foundation/Foundation.h> #import "XMGPerson.h" #im

java中的一般异常与运行时异常

Java提供了两类主要的异常:runtime exception和checked exception.checked 异常也就是我们经常遇到的IO异常,以及SQL异常都是这种异常.对于这种异常,JAVA编译器强制要求我们必需对出现的这些异常进行catch.所以,面对这种异常不管我们是否愿意,只能自己去写一大堆catch块去处理可能的异常. 但是另外一种异常:runtime exception,也称运行时异常,我们可以不处理.当出现这样的异常时,总是由虚拟机接管.比如:我们从来没有人去处理过Nul

iOS Objective -C Runtime 运行时之一: 类与对象

// --------------------------------------------------- 参考:南峰子的技术博客 http://southpeak.github.io //---------------------------------------------------- OC语言是一门动态语言,它将很多静态语言在编译和链接时期做的事放到了运行时来处理.这种动态语言的优势在于:我们编写代码时更具灵活性,如我们可以把消息转发给我们想要的对象,或者随意交换一个方法的实现等.

运行时类型信息RTTI

我们在写C++代码的时候经常碰到使用dynamic_cast进行类型转换的情况,也都知道经过dynamic_cast的转换更加安全,因为dynamic_cast进行了类型检查. 但是可能很多人不知道dynamic_cast是C++ 运行时类型信息(RTTI)机制链条上的一个节点. RTTI提供了两个操作符和一个类: dynamic_cast typeid type_info 整个RTTI, 作为一个整体,暴露给程序员的就是这三个元素.因此我们关注的焦点也就在它们身上了. 什么是RTTI 在C++

saltstack结合Elasticsearch来做salt运行结果展现

salt尽管好用可是机器管理的越来越多,通过cli的结果输出方式查看运行结果越来越多不能满足我的需求.并且作为一个推动运维自己主动化的攻城狮,使用这样的人眼查看运行结果的方式简直土到掉渣.尽管别人看起来逼格非常高.但谁累谁知道...因为以上原因,给各位推荐一种逼格更高的结果查看方式: salt returners 先来看一下官方结构图: Send data returned by Salt Minions to another system, such as a database. Return

Objective-C Runtime 运行时之一:类与对象

Objective-C语言是一门动态语言,它将很多静态语言在编译和链接时期做的事放到了运行时来处理.这种动态语言的优势在于:我们写代码时能够更具灵活性,如我们可以把消息转发给我们想要的对象,或者随意交换一个方法的实现等. 这种特性意味着Objective-C不仅需要一个编译器,还需要一个运行时系统来执行编译的代码.对于Objective-C来说,这个运行时系统就像一个操作系统一样:它让所有的工作可以正常的运行.这个运行时系统即Objc Runtime.Objc Runtime其实是一个Runti