版本

Centos 7

SaltStack 3001.1

Yum源

shell> yum install -y https://repo.saltstack.com/py3/redhat/salt-py3-repo-3001-1.el7.noarch.rpm

注:将3001-1改成latest就是安装最新版本,若是centos8就将el7改成el8

安装

# 安装 master
shell> yum install -y salt-master
# 安装 minion
shell> yum install -y salt-minion

配置

master的配置文件:/etc/salt/master,没有必须修改的,但习惯上会改下file server和pillar的路径:

shell> vim /etc/salt/master
  file_roots:
      base:
        - /mydata/salt/fs  # 文件服务路径,同时也是state文件的路径,默认为/srv/salt
    pillar_roots:
     base:
        - /mydata/salt/pillar  # pillar文件的路径,默认为/srv/pillar

shell> systemctl start salt-master  # 启动服务
shell> systemctl enable salt-master  # 设置开机自启

minion的配置文件:/etc/salt/minion,至少需要修改连接的master及自己的id:

shell> vim /etc/salt/minion
  master: host-master  # 默认为salt,可以设置为master的ip
  id: minion-01  # 默认为hostname,建议多包含一些元素方便过滤,比如OA系统生产环境用来部署web服务的第一台机器:oa-pro-web-01

shell> systemctl start salt-minion  # 启动服务
shell> systemctl enable salt-minion  # 设置开机自启

注:salt-master监听4505和4506端口用于key管理和远程控制,若有防火墙需要放行

在master机器使用salt-key命令接受minion的key,只有接受了key的minion才会纳入master的控制,salt-key的常用参数:

-A

接受所有的key

-a <key>

接受指定的key

-D

删除所有的key

-d <key>

删除指定的key

-L

显示管理中的key,默认参数

接受所有minion的key后:

saltstack多master部署 saltstack安装_命令行

远程命令

在master机器通过salt命令向指定minion远程执行操作:

shell> salt '*' test.ping  # 测试连通性,*为通配符,这里表示所有minion
  minion-03:
    True
  minion-02:
     True
  minion-01:
     True
shell> salt 'minion-01' cmd.run 'ip addr'  # 在minion-01执行命令,查看ip信息
shell> salt 'minion-02' cmd.run 'df -h'  # 在minion-02执行命令,查看磁盘使用情况

salt命令过滤minion的常用参数:


通配符过滤minion的ID,示例:salt '*' test.ping

-L

列表指定1个或多个minion的ID,示例:salt -L 'minion-01,minion-02' test.ping

-E

正则表达式过滤minion的ID,示例:salt -E 'minion-0[1-3]' test.ping

-G

通配符过滤minion的grains,grains是每个minion收集的系统信息,也可以自定义(需要开篇单讲),示例:salt -G 'os:centos' test.ping

-P

正则表达式过滤minion的grains

-I

通配符过滤minion的pillar,pillar是给每个minion自定义的变量(需要开篇单讲)

-J

正则表达式过滤minion的pillar

-C

组合使用上述参数,示例:salt -C '*02 and G@os:centos' test.ping

上述命令中的test.ping和cmd.run表示模块及其方法,可以在命令行通过sys模块查看各个模块和方法的说明:

sys.list_modules

列出命令行可用模块,示例:salt 'minion-01' sys.list_modules

sys.list_functions

列出命令行模块的所有方法,示例:salt 'minion-01' sys.list_functions cmd

sys.doc

显示命令行的模块或方法的说明,示例:salt 'minion-01' sys.doc cmd.run

sys.list_state_modules

列出state可用的模块

sys.list_state_functions

列出state模块的所有方法

sys.state_doc

显示state的模块或方法的说明

文件传输

使用自带的salt-cp命令最方便:

# salt-cp过滤minion的方式与salt一致
shell> salt-cp '*' /path/to/file /minion/dest  # 拷贝文件
shell> salt-cp 'minion-01' -C /path/to/dir/ /minion/dest  # 拷贝文件夹,拷贝较大的文件也必须用-C参数,性能很差,建议用下面的

拷贝大文件更推荐salt命令配合cp模块,这种方式需要先将文件放到/etc/salt/master中file_roots的路径下,本文是:/mydata/salt/fs/

shell> salt '*' cp.get_file salt://path/to/file /minion/dest  # 拷贝文件,/path/to/file是file_roots的相对路径
shell> salt '*' cp.get_dir salt://path/to/dir/ /minion/dest  # 拷贝文件夹

还有一种文件传输需求,就是从minion拷贝文件到master,这个需要先在配置文件/etc/salt/master中允许(为了安全默认都是关闭的):

file_recv: True

然后重启salt-master后,就可以用cp.push了(注:下发是get,上传为push,因为这里是以minion的视角做描述的):

# 只需要指出minion上需要传输的文件即可,上传后将保存在master机器/var/cache/salt/master/minions/minion-id/files/path/to/file
# 该路径通过minion-id区分不同的minion来源,其中/var/cache/salt/master/minions可以在master的/etc/salt/minion中通过cachedir修改(salt-minion不是必要的)
shell> salt '*' cp.push /path/to/file  # 上传文件
shell> salt '*' cp.push /path/to/file upload_path='/new/path/file'  # 可以临时修改保存路径,但只是修改cachedir的相对路径
shell> salt '*' cp.push_dir /path/to/dir/  # 上传文件夹
shell> salt '*' cp.push_dir /path/to/dir/ glob='*.log'  # 匹配指定文件

环境问题

通常,我们会在/etc/profile中配置自定义的环境变量,比如JAVA_HOME,LANG等,那么salt远程执行命令时就有两个问题:

问题一:salt远程命令是non-interactive shell或称之为non-login shell,与日常ssh登录进去的login shell不同的地方是不会自动加载/etc/profile。

  解决方法:可以通过在每次命令前先source下,比如:

source /etc/profile; echo $JAVA_HOME'

  或通过参数runas=user,比如:

runas=root

问题二:salt远程命令会自动重设系统语言为C,所以在/etc/profile中配置的LANG=zh_CN.UTF-8会被覆盖,那么启动的程序输出的中文会乱码。

export LC_ALL=zh_CN.UTF-8,LC_ALL有最高优先级,不为空时salt就不会重设;

  同样也可以通过参数reset_system_locale=False来禁止salt重设,比如:

reset_system_locale=False

Job管理

每一个远程任务就是一个Job,比如执行了一个较长时间的命令,不想等了用ctrl-c退出:

shell> salt 'minion-01' cmd.run 'ping 127.0.0.1 -c 600'
^C
Exiting gracefully on Ctrl-c
This job's jid is: 20201104030638609997
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 20201104030638609997

可以看到,本地虽退出但远程命令的Job会继续运行,其id也就是jid:20201104030638609997,同时提示我们可以用salt-run查看Job的情况。

salt-run命令和saltutil模块都有管理Job的命令,下面是常用的:

salt-run jobs.active

显示所有正在运行的Job

salt-run jobs.list_job <jid>

显示指定Job的信息

salt-run jobs.lookup_jid <jid>

查看指定Job的返回信息,需要执行完毕才有输出

salt-run jobs.exit_success <jid>

检查是否正确退出,只有成功执行完毕才是True

salt-run jobs.print_job <jid>

打印详细的输出,与阻塞等待命令完成时的打印一致

salt-run jobs.list_jobs search_function='cmd.*'

根据条件查询Job

salt-run jobs

显示salt-run管理Job的详细用法

salt 'minion-01' saltutil.running

查看匹配minion上正在运行的Job

salt 'minion-01' saltutil.find_job <jid>

在匹配minion上查找指定Job的信息,只有正在运行中才能查到

salt 'minion-01' saltutil.kill_job <jid>

杀死匹配minion上指定的Job,kill signal 9

salt 'minion-01' saltutil.kill_all_jobs

杀死匹配minion上所有的Job,kill signal 9

注:salt-run和saltutil模块都还有更多有用的功能

另外,执行远程任务时指定--async参数可以直接返回不等待:

shell> salt 'minion-01' cmd.run 'ping 127.0.0.1 -c 600' --async
Executed command with job ID: 20201104034758753405