一 背景
公司禁用ansible,机器越来越多,想试试 SaltStack到底有多块,如何适合上千台机器
官方centos7安装:http://docs.saltstack.cn/topics/installation/rhel.html
二 安装
网上很多教程使用阿里云 , 估计epel源不能用,报错:
No package salt-master available.
stackover给了答案,原文链接:https://stackoverflow.com/questions/24775841/yum-install-gives-no-package-available
Please follow steps mentioned on link to install salt-master
http://docs.saltstack.com/en/latest/topics/installation/rhel.html # 官方文档
it will not be available in default repository
点进去找到centos7的 文档,网址:https://repo.saltproject.io/#rhel
sudo rpm --import https://repo.saltproject.io/py3/redhat/7/x86_64/latest/SALTSTACK-GPG-KEY.pub
curl -fsSL https://repo.saltproject.io/py3/redhat/7/x86_64/latest.repo | sudo tee /etc/yum.repos.d/salt.repo
sudo yum clean expire-cache
yum install salt-master -y # 我看到中间会安装python36
sudo yum install salt-minion -y
sudo yum install salt-ssh -y
sudo yum install salt-syndic -y
sudo yum install salt-cloud -y
sudo yum install salt-api -y
systemctl start salt-minion
systemctl enable salt-minion
systemctl enable salt-master.service && systemctl restart salt-master.service
安装客户端
sudo rpm --import https://repo.saltproject.io/py3/redhat/7/x86_64/latest/SALTSTACK-GPG-KEY.pub
curl -fsSL https://repo.saltproject.io/py3/redhat/7/x86_64/latest.repo | sudo tee /etc/yum.repos.d/salt.repo
sudo yum clean expire-cache
sudo yum install salt-minion -y
systemctl restart salt-minion
systemctl enable salt-minion
三 使用:
原文: https://www.cnblogs.com/wangyajian/p/11549078.html
# 配置 master 和minion
cat /etc/salt/master
master: 10.0.0.251
user: root
cat /etc/salt/minion | grep -v ^$ | grep -v ^#
master: 10.0.0.251
user: root
id: agent251 # 这个ip不写的话默认使用主机名称作为ip 就配置在cat /etc/salt/minion_id
# 下发密钥
# sudo salt-key --list-all # 查看所有密钥
# salt-key --accept-all -y # 下发所有密钥
# 下面是简写
salt-key -L
salt-key -A -y
# 测试
sudo salt '*' test.ping
sudo salt 'agent251' test.ping
sudo salt 'agent252' test.ping
注:
master 秘钥对默认存储在/etc/salt/pki/master/master.pub /etc/salt/pki/master/master.pem
master 端认证的公钥存储在:/etc/salt/pki/master/minions/
minion 秘钥对默认存储在/etc/salt/pki/minion/minion.pub /etc/salt/pki/minion/minion.pem
minion 存放的master公钥/etc/salt/pki/minion/minion_master.pub
minion_id 默认存储在/etc/salt/minion_id #?
四 报错排查
Minion did not return. [No response]
The minions may not have all finished running and any remaining minions will return upon completion. To look up the return data for this job later, run the following command:
salt-run jobs.lookup_jid 20210517224159109068
1. 查看minion端的日志信息
[root@iZbp150ikdomqe3b32qaubZ salt]# cat /var/log/salt/minion
[root@iZbp150ikdomqe3b32qaubZ salt]# systemctl restart salt-minion.service
[root@iZbp150ikdomqe3b32qaubZ salt]# cat /var/log/salt/minion
2018-05-26 18:03:22,963 [salt.utils ][ERROR ][21937] DNS lookup of 'salt' failed.
2018-05-26 18:03:22,963 [salt.minion ][ERROR ][21937] Master hostname: 'salt' not found. Retrying in 30 seconds
2018-05-26 18:03:52,986 [salt.utils ][ERROR ][21937] DNS lookup of 'salt' failed.
2018-05-26 18:07:23,176 [salt.minion ][ERROR ][21937] Master hostname: 'salt' not found. Retrying in 30 seconds
2018-05-26 18:07:30,020 [salt.crypt ][ERROR ][22002] The Salt Master has cached the public key for this node, this salt minion will wait for 10 seconds before attempting to re-authenticate
根据报错信息分析:
minion大概的意思就是,minion端拿到的key与master端的不符,验证无法通过。
解决方法是删除minion端的key,再重新与master进行连接和认证。
2. 删除minion端的salt-master秘钥信息
[root@salt-slave-node1 minion]# pwd
/etc/salt/pki/minion
[root@salt-slave-node1 minion]# ls
minion_master.pub minion.pem minion.pub
[root@salt-slave-node1 minion]# rm -rf minion_master.pub
3. 重新验证秘钥测试
[root@iZwz9bhan5nqzh979qokrkZ pki]# salt-key -L
Accepted Keys:
Denied Keys:
Unaccepted Keys:
iZbp150ikdomqe3b32qaubZ
izwz9f8xrvty50quc2gq50z
Rejected Keys:
[root@iZwz9bhan5nqzh979qokrkZ pki]# salt-key -A
The following keys are going to be accepted:
Unaccepted Keys:
iZbp150ikdomqe3b32qaubZ
izwz9f8xrvty50quc2gq50z
Proceed? [n/Y] Y
Key for minion iZbp150ikdomqe3b32qaubZ accepted.
Key for minion izwz9f8xrvty50quc2gq50z accepted.
[root@iZwz9bhan5nqzh979qokrkZ pki]# salt '*' test.ping
izwz9f8xrvty50quc2gq50z:
True
iZbp150ikdomqe3b32qaubZ:
True
重新认证:
salt minion 和salt master之间重新建立认证
修改了minion端的id之后 比如修改了hostname之后,
minion端会将minion的id 存放在/etc/salt/minion_id
文件中,重启不会改变。所以要重新认证就需要以下2步:
1、清空minion_id
>/etc/salt/minion_id
2.删除minion存放masterkey的文件pki文件夹下所以的东西
rm -rf /etc/salt/pki/*
3.重启minion
service salt-minion restart
在master端:
删除pki文件之后,重启即可:
rm -rf /etc/salt/pki/*
service salt-master restart
之后就可以salt-key看到新的minion id了。
扩展: Jenkins 集成 saltstack
参考:https://cloud.tencent.com/developer/article/1523261
附录:
salt-master配置文件详解
interface: 192.168.28.141 #绑定到本地的某个网络地址
publish_port: 4505 #默认端口4505,设置master与minion通信端口
user: root #运行salt进程的用户
max_open_files: 100000 #master可以打开的最大句柄数
worker_threads: 5 #启动用来接收或应答minion的线程数
ret_port: 4506 #master用来发送命令或接受minions的命令执行返回信息
pidfile: /var/run/salt-master.pid #指定master的pid文件位置
root_dir: / #该目录为salt运行的根目录,改变它可以使salt从另外一个目录运行,好比chroot
pki_dir: /etc/salt/pki/master #存放pki认证密钥
cachedir: /var/cache/salt #存放缓存信息,salt工作执行的命令信息
verify_env: True #启动验证和设置权限配置目录
keep_jobs: 24 #保持工作信息的过期时间,单位小时
job_cache: True #设置master维护的工作缓存.当minions超过5000台时,它将很好的承担这个大的架构
timeout: 5 #master命令执可以接受的延迟时间
output: nested #salt命令的输出格式
minion_data_cache: True #关于minion信息存储在master上的参数,主要是pilar和grains数据
auto_accept: False #默认值False. master自动接受所有发送公钥的minion
file_recv: False #允许minion推送文件到master上
file_recv_max_size: 100 #默认值100,设置一个hard-limit文档大小推送到master端
state_top: top.sls #状态入口文件
renderer: yaml_jinja #使用渲染器用来渲染minions的状态数据
failhard: False #当单个的状态执行失败后,将会通知所有的状态停止运行
salt命令详解
salt "*" sys.list_modules # 查看所有模块
# salt -h
Usage: salt [options] '<target>' <function> [arguments]
Options(选项):
--version : 查看saltstack软件的版本号。
--versions-report : 查看saltstack软件以及依赖包的版本号。
-h, --help : 查看帮助信息。
--saltfile=SALTFILE:指定saltfile的路径。 如果没有通过,将在当前工作目录中搜索一个。
-c CONFIG_DIR, --config-dir=CONFIG_DIR:指定配置文件的目录(默认是/etc/salt/)。
-t TIMEOUT, --timeout=TIMEOUT:指定超时时间默认是5秒。
--hard-crash:捕捉到original异常不退出默认关闭。
-s, --static:以组的形式返回所有minion的数据。
-p, --progress:显示进度图,需要progressbar的python包。
--failhard :在第一个执行错误返回之后停止批处理。
--async : 异步执行。
--subset=SUBSET : 对目标minions的随机子集执行程序. minions在执行前会先验证是否存在该命名的函数,再去执行
-v, --verbose : 打开命令详细,显示jid和活动的工作查询
--hide-timeout : 隐藏超时时间。
--show-jid : 显示任务的jid。
-b BATCH, --batch=BATCH, --batch-size=BATC : 按照百分比执行任务。
-a EAUTH, --auth=EAUTH, --eauth=EAUTH, --external-auth=EAUTH : 指定外部认证方式。
-T, --make-token : 生成master token.
--return=RETURNER : 设置一种替代方法。 默认情况下,salt将从命令将返回数据发送回主服务器,但返回数据可以重定向到任意数量的系统,数据库或应用程序。
--return_config=RETURNER_CONF : 指定命令返回的设置文件。
-d, --doc, --documentation : 查看指定模式或所有模块文档。
--args-separator=ARGS_SEPARATOR : 指定发送命令跟命令参数的分隔符,当用户想把一个命令当作参数发送给另一个命令执行时。
--summary : 显示汇总信息。
--username=USERNAME : 指定外部认证的用户名。
--password=PASSWORD : 指定外部认证的密码。
--metadata=METADATA : 将元数据传递给Salt,用于搜索作业。
Logging Options(日志相关参数):
-l LOG_LEVEL, --log-level=LOG_LEVEL : 指定日志级别。
--log-file=LOG_FILE : 指定日志记录文件
--log-file-level=LOG_LEVEL_LOGFILE : 日志文件日志记录级别。'all', 'garbage', 'trace', 'debug', 'info', 'warning', 'error','critical', 'quiet'. 默认: 'warning'.
Target Options(目标选择选项):
-E, --pcre : 正则匹配
-L, --list: 列表匹配,目标表达式将被解释为以逗号分隔的列表。
-G, --grain: grains匹配。
--grain-pcre :grains加正则匹配。
-N, --nodegroup:组匹配。
-R, --range:范围匹配。
-C, --compound : 综合匹配(指定多个匹配,空格隔开)。
-I, --pillar : pillar值匹配。
-J, --pillar-pcre : pillar加正则匹配。
-S, --ipcidr : minions网段地址匹配。
Output Options(输出参数):
--out=OUTPUT, --output=OUTPUT : 使用指定的输出器从'salt'命令打印输出。 内置的是 'key', 'yaml', 'overstatestage', 'newline_values_only', 'pprint', 'txt', 'raw', 'virt_query', 'compact', 'json', 'highstate', 'nested', 'quiet', 'no_return'.
--out-indent=OUTPUT_INDENT, --output-indent=OUTPUT_INDENT : 在空格中打印由提供的值缩进的输出。 负值禁用缩进。 仅适用于支持缩进的输出器。
--out-file=OUTPUT_FILE, --output-file=OUTPUT_FILE : 输出到指定文件。
--out-file-append, --output-file-append : 输出附加到指定的文件。
--no-color, --no-colour : 关闭所有的颜色显示。
--force-color, --force-colour : 强制输出颜色显示。
--state-output=STATE_OUTPUT, --state_output=STATE_OUTPUT : 覆盖配置的state_output值输出,指定state格式(full, terse, mixed, changes or filter)输出,默认值是full。
salt-key命令详解
# salt-key -h
Actions:
-l ARG, --list=ARG:显示指定状态的key(支持正则表达式)
-L, --list-all :列出所有公钥。"--list all"已经弃用。
-a ACCEPT, --accept=ACCEPT: 接受指定的公钥(除了挂起的密钥之外,使用--include-all匹配拒绝的密钥),支持正则表达式。
-A, --accept-all :接收所有等待认证的key。
-r REJECT, --reject=REJECT :拒绝指定等待认证的key(支持正则表达式)
-R, --reject-all:拒绝所有等待认证的key。
--include-all: 显示所有状态的key。
-p PRINT, --print=PRINT :打印指定的公钥支持正则表达式。
-P, --print-all:打印所有的公钥。
-d DELETE, --delete=DELET:删除指定的key。
-D, --delete-all:删除所有的key。
-F, --finger-all:显示所有key的指纹信息。
查找模块
salt '*' -d|grep ":" |grep disk
查找某个模块拥有的方法
salt 'agent1' sys.list_functions test