1. saltstack
1. 简介
Saltstack 比 Puppet 出来晚几年,是基于Python 开发的,也是基于 C/S 架构,服务端 master 和客户端 minions ;Saltstack 和 Puppet 很像,可以说 Saltstatck 整合了 Puppet 和 Chef 的功能,更加强大,更适合大规模批量管理服务器,并且它比 Puppet 更容易配置。
三大功能:
- 远程命令执行
- 配置管理(服务,文件,cron,用户,组)
- 云管理。
支持系统:大多数都支持,windows 上不支持安装 master。
2. 安装配置
1. 准备工作
准备两台机器,这两台机器都关闭 selinux,清空 iptables 规则并保存。
master:192.168.44.201
slaver:192.168.44.202
2、编辑 hosts 文件
两台都设置,若机器太多,可以通过搭建 DNS,则不用在每台机器上设置这个
[root@localhost ~]# vim /etc/hosts
192.168.44.201 server.com
192.168.44.202 client.com
3.服务器端
[root@server ~]# wget https://repo.saltproject.io/yum/redhat/salt-repo-latest.el7.noarch.rpm
[root@server ~]# rpm -ivh salt-repo-latest.el7.noarch.rpm
[root@server ~]# yum install salt-master -y
[root@server ~]# yum install salt-minion -y
4. 客户端
[root@client ~]# yum install salt-minion -y
5. 配置客户端
[root@client ~]# vim /etc/salt/minion
master: 192.168.44.201
6. 启动服务
[root@server ~]# systemctl restart salt-master
[root@server ~]# systemctl restart salt-minion
[root@client ~]# systemctl restart salt-minion
3. 配置认证
1. 服务端操作
查看都有哪些minion端的密钥
[root@server ~]# salt-key
Accepted Keys:
Denied Keys:
Unaccepted Keys:
client.com
server.com
Rejected Keys:
同意minion端的key
[root@server ~]# salt-key -A
The following keys are going to be accepted:
Unaccepted Keys:
client.com
server.com
Proceed? [n/Y] y
Key for minion client.com accepted.
Key for minion server.com accepted.
[root@server ~]# salt-key
Accepted Keys:
client.com
server.com
Denied Keys:
Unaccepted Keys:
Rejected Keys:
说明:
- -a :accept
- -A:accept-all
- -d:delete
-D:delete-all
可以使用 salt-key 命令查看到已经签名的客户端。此时我们在客户端的 /etc/salt/pki/minion 目录下面会多出一个minion_master.pub 文件。 - -d 删除单个key,也支持*号模糊匹配删除 (针对key的操作)
- -D 删除所有key,慎用 (针对key的操作)
- -L 列表 (远程执行、列表key等)
- -A 同意所有key (针对key的操作)
- -a 同意单个,可以用*号迷糊匹配添加 (针对key的操作)
- -G 匹配Grains (远程执行)
- -I 匹配Pillar (远程执行)
- -E 支持正则表达式 (远程执行)
- -S 指定客户端的ip地址 (远程执行)
- -C 一条远程执行的命令同时支持多个参数 (远程执行)
- -N 支持节点组 (远程执行)
测试saltstack的master端与minion端通讯
[root@server ~]# salt '*' test.ping
client.com:
True
server.com:
True
[root@server ~]# salt 'client*' test.ping
client.com:
True
4. 模块使用
1. saltstack使用之远程执行shell命令
[root@server ~]# salt "*" cmd.run 'id robin'
server.com:
uid=1000(robin) gid=1000(robin) groups=1000(robin)
client.com:
uid=1000(robin) gid=1000(robin) groups=1000(robin)
2. saltstack远程执行之service模块
[root@server ~]# salt "*" service.available sshd
client.com:
True
server.com:
True
# reload重启服务
[root@server ~]# salt "*" service.reload sshd
client.com:
True
server.com:
True
# status查看服务状态
[root@server ~]# salt "*" service.status sshd
client.com:
True
server.com:
True
stop关闭服务
[root@server ~]# salt "*" service.stop httpd
client.com:
False
server.com:
False
start启动服务
[root@server ~]# salt "*" service.start httpd
client.com:
False
server.com:
False
get_all显示所有运行的服务
[root@server ~]# salt "*" service.get_all
拷贝文件到远程
salt 'client.com' cp.get_file salt://top.sls /tmp/cp.txt
[root@server srv]# vim /etc/salt/master
file_roots:
base:
- /srv/salt/
[root@server salt]# ls /srv/salt/top.sls
/srv/salt/top.sls
拷贝目录到远程
[root@server salt]# salt 'client.com' cp.get_dir salt://test /tmp
client.com:
- /tmp/test/1.sh
- /tmp/test/test.txt
- /tmp/test/xx/123.txt
显示存活的客户端
[root@server salt]# salt-run manage.up
执行脚本
[root@server salt]# salt 'client.com' cmd.script salt://test/shell.sh
5. grains和pillar
1.grains
grains 是在 minion(客户端)启动时收集到的一些信息,比如操作系统类型、网卡ip等。
使用命令:
列出所有的 grains 项目名字
[root@server ~]# salt 'client.com' grains.ls
列出所有的 grains 项目名以及值
[root@server ~]# salt 'client.com' grains.items
获取指定项目
[root@server ~]# salt 'client.com' grains.item master
client.com:
----------
master:
192.168.0.201
grains的信息并不是动态的,并不会时时变更,它只是在 minion 启动时收集到的。grains 也可以做配置管理。
下面我们来自定义 grains
客户端上配置:
[root@client ~]# cat /etc/salt/grais
#grains:
# roles:
# - webserver
# - memcache
# deployment: datacenter4
# cabinet: 13
# cab_u: 14-15
或者
[root@client ~]# vim /etc/salt/minion
grains:
roles:
- nginx
env:
- test
myname:
- tpp
重启minion服务
[root@client ~]# systemctl restart salt-minion
服务端获取 grains
root@server ~]# salt 'client.com' grains.item role env myname
2. pillar
pillar是saltstack最重要的组件之一,其作用是定义与被控主机相关的任何数据,定义好的数据可以直接被其他组件使用,如被模板,state,api等使用。
pillar 和 grains 不一样,是在 master 上定义的,并且是针对 minion 定义的一些信息。像一些比较重要的数据(密码)可以存在 pillar 里,还可以定义变量等。
查看指定minion的 pillar 值:
[root@server ~]# salt 'client.com' pillar.items
client.com:
----------
pillar自定义配置
[root@server ~]# vim /etc/salt/master #找到如下内容,去掉#号
pillar_roots:
base:
- /srv/pillar
[root@server ~]# vim /etc/salt/master
[root@server ~]# mkdir /srv/pillar
自定义配置文件,内容如下
[root@server ~]# vim /srv/pillar/test.sls
[root@server ~]# cat /srv/pillar/test.sls
conf: /tmp/123.conf
myname: tpp
总入口文件,内容如下
[root@server ~]# cat /srv/pillar/top.sls
base:
'client.com':
- test
[root@server ~]# salt 'client.com' pillar.items
client.com:
----------
conf:
/tmp/123.conf
myname:
tpp
当更改完 pillar 配置文件后,我们可以通过刷新 pillar 配置来获取新的 pillar 状态:
[root@server ~]# systemctl restart salt-master
[root@server ~]# salt '*' saltutil.refresh_pillar
client.com:
True
server.com:
True
[root@server ~]# salt 'client.com' pillar.items
client.com:
----------
conf:
/tmp/123.conf
myname:
tpp
[root@server ~]# salt 'client.com' pillar.item myname
client.com:
----------
myname:
tpp
[root@server ~]# salt 'client.com' pillar.item conf
client.com:
----------
conf:
/tmp/123.conf
6. 实例一
项目一
1.下面进行的演示是远程通过 yum 方式安装 Apache
注意:环境: base、dev(开发环境)、test(测试环境)、prod(生产环境)。
pkg模块
参数:
- installed:安装
- latest:将软件更新到最新
- removed:删除软件
- pkgs:安装多个软件包时,一次全部安装(推荐)
- names:安装多个软件包时,一次安装一个(不推荐)
[root@server srv]# vim /etc/salt/master
file_roots:
base:
- /srv/salt/
# 注: 修改此处配置时,需要先将之前修改的配置进行注释
[root@server srv]# mkdir /srv/salt/
[root@server ~]# vim /srv/salt/top.sls
[root@server srv]# cat /srv/salt/top.sls
base:
'client.com':
- apache
[root@server ~]# vim /srv/salt/apache.sls
[root@server srv]# cat /srv/salt/apache.sls
apache-service:
pkg.installed:
- names:
- httpd
- httpd-devel
service.running:
- name: httpd
- enable: True
注意:apache-service 是自定义的 id 名。pkg.installed 为包安装函数,下面是要安装的包的名字。service.running 也是一个函数,来保证指定的服务启动,enable 表示开机启动。
2.重启服务
[root@server srv]# systemctl restart salt-master
3.执行命令
[root@server srv]# salt 'client.com' state.highstate
后面由于是cat查看的,所以直接复制的话可能会出现错误。
使用salt ‘*’ pillar.items检查一下格式问题
项目二
文件管理
file.managed
参数:
- user:用户
- group:用户组
- mode:文件属性(如644)
- template:模板类型(比如:jinja)
- makedirs:默认为False,如果被管理的文件父目录不存在则失败,如果为True,如果父目录不存在则会创建
- dir_mode:设置创建目录的权限
- replace:默认为True,若设置为False将不替换文件内容,但是会更改权限
- context:覆盖文件上下文参数
- default:默认上下文参数
- backup:备份功能,有改动才备份,会备份到minion下 的:/var/cache/salt/minion/backup_files
- show_off: 设置成False,则不显示更改的不同点,默认为True
- create: 默认为True,如果设置为False,在文件存在的情况下则只更改文件
- contents: 默认为空,添加字符串到文本中
[root@server srv]# cat /srv/salt/top.sls
base:
'client.com':
- filetest
[root@server srv]# cat /srv/salt/filetest.sls
file-test:
file.managed:
- name: /tmp/filetest.txt
- source: salt://test/test.txt
- user: root
- group: root
- mode: 777
注意:第一行的 file-test 为自定的名字,表示该配置段的名字,可以在别的配置段中引用它;source指定文件从哪里拷贝,这里的 test 目录相当于是 /srv/salt/test 目录;name指定远程客户端要生成的文件。
[root@server srv]# mkdir /srv/salt/test/
[root@server srv]# cat /srv/salt/test/test.txt
123123
[root@server srv]# salt 'client.com' state.highstate
客户端验证:
[root@client ~]# cat /tmp/filetest.txt
123123
项目三:
目录管理:
[root@server srv]# cat /srv/salt/top.sls
base:
'client.com':
- filedir
[root@server srv]# cat /srv/salt/filedir.sls
file-dir:
file.recurse:
- name: /tmp/testdir
- source: salt://test/xx
- user: root
- file_mode: 777
- dir_mode: 777
- mkdir: True
- clean: True
[root@server srv]# mkdir /srv/salt/test/xx
[root@server srv]# cat /srv/salt/test/xx/xx.txt
aaaaa
[root@server srv]# salt 'client.com' state.highstate
clean: True 功能
[root@server srv]# rm -rf /srv/salt/test/xx /xx.txt
[root@server srv]# touch /srv/salt/test/xx/123.txt
[root@server srv]# salt 'client.com' state.highstate
客户端:
[root@client ~]# ls /tmp/testdir/
123.txt
项目四
远程执行命令
前面提到远程执行命令 test.ping,cmd.run,点前面的是模块,点后面的是函数;这样总归是不太规范化,下面详细介绍怎么远程执行命令和脚本。
cmd模块
参数:
- name:要执行的命令
- unless:用于检查的命令,只有unless指向的命令返回False时才执行name那行的命令
- cwd:执行命令时的目录,默认为root
- user:以指定用户身份运行命令
- group:以指定用户组身份运行命令
- run:运行name后的命令
- require:确保某个模块执行之后才执行这个模块
[root@server srv]# cat /srv/salt/top.sls
base:
'client.com':
- cmdtest
[root@server srv]# cat /srv/salt/cmdtest.sls
cmd-test:
cmd.run:
- onlyif: test -f /tmp/xx.txt
- names:
- touch /tmp/cmdtest.txt
- mkdir /tmp/cmdtest
- user: root
[root@server srv]# salt 'client.com' state.highstate
客户端:
[root@client ~]# ls /tmp/
cmdtest
cmdtest.txt
项目五
远程执行脚本:
[root@server srv]# cat /srv/salt/top.sls
base:
'client.com':
- shelltest
[root@server srv]# cat /srv/salt/shelltest.sls
shell-test:
cmd.script:
- source: salt://test/1.sh
- user: root
[root@server srv]# cat /srv/salt/test/1.sh
#!/bin/bash
useradd tom
[root@server srv]# salt 'client.com' state.highstate
客户端:
[root@client ~]# id tom
uid=1003(tom) gid=1004(tom) 组=1004(tom)
计划任务
[root@server srv]# cat /srv/salt/top.sls
base:
'client.com':
- crontest
[root@server srv]# cat /srv/salt/crontest.sls
cron-test:
cron.present:
- name: /usr/sbin/useradd jerry
- user: root
- minute: "*"
- hour: 20
- daymonth: 21-25
- month: '9,10'
- dayweek: '*'
[root@server srv]# salt 'client.com' state.highstate
客户端
[root@client ~]# crontab -l
# Lines below here are managed by Salt, do not edit
# SALT_CRON_IDENTIFIER:/usr/sbin/useradd jerry
* 20 21-25 9,10 * /usr/sbin/useradd jerry
删除计划任务
vim /srv/salt/crontest.sls把 cron.present: 改成 cron.absent:
注意:两者不能共存,要想删除一个 cron,那之前的 present 就得替换掉或者删除掉。
user模块
present:创建用户
absent:删除用户
fullname:用户名
password:密码
uid:
gid:
createhome:True为创建家目录,False不创建家目录
home:用户家目录
hwg:
user.present:
- fullname: Jim
- shell: /bin/bash
- home: /home/hwg
- uid: 600
- gid: 600
- groups:
- wheel
- storage
- games
sysctl.present:修改系统内核参数
vm.swappiness:
sysctl.present:
- value: 0
net.ipv4.ip_local_port_range:
sysctl.present:
- value: 10000 61000
fs.file-max:
sysctl.present:
- value: 186981
1我依赖谁? require
2我被谁依赖? require_in
3我监控谁? watch (包含require)
4我被谁监控?watch_in