saltstack手册

saltstack是一个新的基础设施管理工具。目前处于快速发展阶段,可以看做是强化的Func+弱化的Puppet的组合。

saltstack 使用 Python 开发,非常简单易用和轻量级的管理工具。
MasterMaster和Minion构成,通过ZeroMQ进行通信.

大概有3个方式来安装saltstack,任选其一.

2.1 通过epel源/官方源安装

epel是最简单高效的方式,但安装的saltstack版本较低,截止目前版本才2015.8月的,没啥特殊需求其实也够用了.
官网的就最新1).

#epel源安装,版本较旧
yum install epel-release
#官方repo安装
yum install https://repo.saltstack.com/yum/redhat/salt-repo-latest-1.el7.noarch.rpm
#安装salt-master
yum install salt-master
#安装salt-minion
yum install salt-minion

2.2 通过官网提供的脚本安装

官网提供的其他更多安装方法.

#Using wget to install your distribution's stable packages
wget -O bootstrap-salt.sh https://bootstrap.saltstack.com
bash bootstrap-salt.sh

3.1 配置salt-master

/etc/salt/master,基本上不需要配置就能使用.

saltstack的master和minion配置都很简单,但是需要注意的是,每个参数冒号后面都要带一个空格如: interface: 192.168.1.229

  • 默认salt master 在所有接口(0.0.0.0)上监听4505和4506;
  • interface: 192.168.1.229 #bind特定ip
  • auto_accept: True #自动接受客户端的 KEY 2)

3.2 配置salt-minion

以下参数配置了就可以用了: 3)

  • master:指定master的ip/FQDN;
  • id:指定被master识别的id,一般设置为主机名;

#启动服务端
systemctl start salt-master
#启动客户端
systemctl start salt-minion
#开机启动
systemctl enable salt-master
systemctl enable salt-minion

  • 服务端:/var/log/salt/master
  • 客户端:/var/log/salt/minion

6.1 Master与Minion的连接

  • Saltstack master 启动后默认监听 45054506 两个端口;
  • 4505(publish_port)为 salt 的消息发布系统,4506(ret_port)为 salt 客户端与服务端通信的端口;
  • 如果使用 lsof 查看4505 端口,会发现所有的 Minion 在 4505 端口持续保持在 ESTABLISHED;

6.2 Master与Minion认证过程

  1. minion 在第一次启动时,会在/etc/salt/pki/minion/(该路径在/etc/salt/minion 里面设置)下自动生成 minion.pem(private key)和 minion.pub(public key),然后将 minion.pub发送给 master。
  2. master 在接收到minion的public key后,通过salt-key命令accept minion public key,这样在 master 的/etc/salt/pki/master/minions 下的将会存放以 minion id 命名的 publickey, 然后 master 就能对 minion 发送指令了。

7.1 KEY管理

Salt 在 master和minion数据交换过程中使用AES加密,为了保证发送给minion的指令不会被篡改,master 和 minion 之间认证采用信任的接受(trusted, accepted)的 key. 在发送命令到minion之前,minion的key需要先被master所接受(accepted).

  • master端证书存放路径:/etc/salt/pki/master/minions
  • minion端证书存放路径: /etc/salt/pki/minion/

运行salt-key 可以列出当前 key 的状态. 认证命令为salt-key,常用的有如下命令:

-L     列出key的接受情况
-a     接受指定key
-A     接受所有key
-r     拒绝指定key
-R     拒绝所有key
-d     删除指定key
-D     删除所有key

7.2 Targeting Minion

Targeting Minion即匹配指定哪些Minion,指定哪些Minion需要被Master发送命令.

7.2.1 Glob

老实讲我也不知道为啥叫这个名字…对应的匹配方式类似:

#保护或转义通配符,避免被shell展开
salt '*' test.ping
salt \* test.ping
salt '*.example.*' test.ping
salt 'web?.example.net' test.ping
salt 'web[1-5]' test.ping
salt 'web-[x-z]' test.ping
#指定列表
salt -L 'web1,web2,web3' test.ping

7.2.2 PCRE正则表达式匹配

  • 短选项: -E
  • 长选项: –pcre
#匹配 web1-prod 和 web1-devel minion:
salt -E 'web1-(prod|devel)' test.ping
#对230和68进行检测
salt -E '230|68' test.ping

7.2.3 list匹配

通过逗号分隔的列表来指定多个Minion,列表中的项不使用glob或正则进行模式匹配,必须是显示声明的.

  • 短选项: -L
  • 长选项: –list
salt -L 'web1,web2,db1,proxy1' test.ping
salt -L 'ceph-3,CentOS-7-test' cmd.run 'hostname'

7.2.4 Subnet匹配

  • 短选项: -S
  • 长选项: –ipcidr
#IP or SUBET
salt -S 192.168.1.0/24 test.ping
salt -S 192.168.1.10 test.ping

7.2.5 Grian匹配

Grain通过OS,CPU等信息来匹配Minion,这样弹性很强.由于IP信息也是包含在上述中的,所以也可以通过IP来匹配.4)

Grain是键值对,所以键名和值都要指定,用分号进行分隔.

  • 短选项: -G
  • 长选项: –grain
salt '*' grains.ls             #查看grains分类
salt '*' grains.items          #查看grains所有信息
salt '*' grains.item osrelease #查看grains某个信息
#Grain通过OS匹配
salt -G 'os:centos' cmd.run 'hostname'
#多级字典
salt -G 'ip_interface:eth0:192.168.1.38' cmd.run 'hostname'

7.2.5.1 Grain PCRE 匹配

Grian匹配很高效灵活,搭配PCRE更加强大.

  • 短选项: N/A
  • 长选项: –grain-pcre
salt --grain-pcre 'os:red(hat|flag)' test.ping

7.2.6 Pillar

  • 短选项: -I
  • 长选项: –pillar

类似 Grain,待完善…


7.2.7 混合

  • 短选项: -C
  • 长选项: –compound

混合Targeting允许用户在一个shell中指定多种target类型.默认使用glob,要指定其他类型需要在前面追加类型简写和@符号.

7.2.7.1 Target类型简写

G	Grain
E	PCRE Minion ID
P	Grain PCRE
L	列表/list
I	Pillar
S	子网/IP地址
R	SECO范围
#ubuntu系统,pillar的role是web,属于192.168.100.0/24子网的Minion
salt -C 'G@os:ubuntu,I@role:web,S@192.168.100.0/24' cmd.run 'hostname'
#布尔符号的and,or,not也可在target类型中使用
salt -C 'web* or *qa,G@os:ubuntu' cmd.run 'hostname'

7.2.8 节点组(Nodegroup)

  • 短选项: -N
  • 长选项: –nodegroup

在命令行使用前,必须在Master的配置文件中以target列表进行定义(混合匹配语法),如在配置文件中进行如何定义: webdev和webqa前是2个空格.

nodegroups
  webdev: 'I@role:web,G@cluster:dev'
  webqa: 'I@role:web,G@cluster:qa'
  webprod: 'I@role:web,G@cluster:prod'

节点定义完后重启Master,然后执行:

salt -N webdev cmd.run 'hostname'

7.3 saltstack常用模块/命令

salt <target> <模块名>.<方法> [参数]

7.3.1 test.ping

saltstack最简单的命令,返回True/False 来表示Master和Minion间的连通性.

7.3.2 cmd.run

把客户端 id 和发送的命令,用单引号括起来,养成习惯,防止出错!

salt '68' cmd.run 'df -h'
salt -E '230|68' cmd.run 'df -h'
salt '*'  test.ping
salt '*'  cmd.run 'df -h'
#超时控制
salt '*' cmd.run 'df -h ' -t 5

7.3.3 cp.get_file

salt '*' cp.get_file salt://jdk-8u112-linux-x64.rpm /tmp/jdk.rpm

7.3.4 cmd.script

这个是比较强大的命令,意思是可以从Master下载一个脚本在客户端执行.
需要配置Master, 把脚本放在$file_roots目录.5)

#如果没有/srv/salt/script目录就创建一个.
file_roots:
   base:
     - /srv/salt
salt '*' cmd.script salt://iptables.sh ['arg1 arg2']
#查看fileserver文件列表
salt-run fileserver.file_list
salt-run fileserver.file_list saltenv=prod

7.3.5 pkg.install

指定一个包名,saltstack就会帮你在不同OS(不同包管理器)完成包安装.

7.3.6 - pkg.remove

指定要卸载的包名.

7.3.7 其他文件类操作方法

file.chown,file.chgroup,file.rename,file.copy等等…

7.3.8 用户及用户组管理方法

saltstack也包含了大多数UNIX中用于管理用户/用户组的工具,如user.add,user.delete,user.info,group.add,group.delete,group.info,user.chuid,user.chgid,user.chshell,user,chhome,user.chgroups等.

7.3.9 salt-cp

6), 7)

salt-cp [options] '<target>'SOURCE DEST
#把master上的hosts文件分发到所有主机
salt-cp '*' /etc/hosts /etc/hosts
salt-ssh远程主机批量自动登陆

7.3.10 salt-run检查客户端up状态

#如果服务器禁ping,则该处不准。
salt-run manage.status #查看所有客户端up/down状态
salt-run manage.up     #只显示up状态的客户端
salt-run manage.down   #只显示down状态的客户端
salt                   #实时批量操作

7.3.11 常用操作

#列出所有key
salt-key -L
#接受所有key,只有被master接受key,master才能管理minion
salt-key -A
#测试master和minion之间的连通性
salt '*' test.ping
#安装vim
salt '*' pkg.install vim
#执行系统命令
salt '*' cmd.run 'ls -l /etc'
salt '*' disk.usage
salt '*' network.interfaces eth0

7.4 state模块

state模块,我目前浅显的理解就是一个描述文件,saltstack会自己去处理这些流程,最终达到你描述的状态.
然后我通过一个简单的实例来说明state如何使用.
首先确保/etc/salt/master的file_roots已经配置:

file_roots:
   base:
     - /srv/salt/

再在/srv/salt/放置tmux.conf8),这个文件将被分发至minion.
再编写一个sls后缀的文件:

cat > /srv/salt/tmux.sls << EOF
tmux:
  pkg.installed
 
/etc/tmux.conf:
  file.managed:
    - source: salt://tmux.conf
    - mode: 644
    - user: root
    - group: root
EOF

master上执行以下命令,minion便安装好了tmux,并获得一份tmux.conf配置文件.

salt '*' state.sls tmux

输出返回

输出返回

CentOS-7-test:
----------
          ID: tmux
    Function: pkg.installed
      Result: True
     Comment: The following packages were installed/updated: tmux
     Started: 16:26:31.083515
    Duration: 211878.596 ms
     Changes:
              ----------
              tmux:
                  ----------
                  new:
                      1.8-4.el7
                  old:
----------
          ID: /etc/tmux.conf
    Function: file.managed
      Result: True
     Comment: File /etc/tmux.conf updated
     Started: 16:30:02.965254
    Duration: 44.496 ms
     Changes:
              ----------
              diff:
                  New file
              mode:
                  0644

Summary for CentOS-7-test
------------
Succeeded: 2 (changed=2)
Failed:    0
------------
Total states run:     2
Total run time: 211.923 s

  • linux/saltstack/saltstack手册.txt
  • 最后更改: 2019/04/16 18:31
  • (外部编辑)