传统运维效率低,大多工作人为完成
传统运维工作繁琐,容易出错
传统运维每日重复做相同的事情
传统运维没有标准化流程 传统运维的脚本繁多,不能方便管理
自动化运维就是要解决上面所有问题、
基于rubby开发,c/s架构,支持多平台,可管理配置文件、用户、cron任务、软件包、系统服务等。 分为社区版(免费)和企业版(收费),企业版支持图形化配置。
基于python开发,c/s架构,支持多平台,比puppet轻量,在远程执行命令时非常快捷,配置和使用比puppet容易,能实现puppet几乎所有的功能。
更加简洁的自动化运维工具,不需要在客户端上安装agent,基于python开发。可以实现批量操作系统配置、批量程序的部署、批量运行命令。
官方安装文档:https://repo.saltstack.com/#rhel
示例:3台机器 A机器作为中控中心(服务端) B和C机器作为(客户端)
1,首先安装SaltStack存储库和密钥(A/B/C三台安装)
yum install https://repo.saltstack.com/yum/redhat/salt-repo-latest-2.el7.noarch.rpm
2.清除下缓存
yum clean expire-cache
3.安装master和minion(只需在服务端安装)
yum install salt-master
yum install salt-minion
客户端只需安装:yum install salt-minion
4.启动服务之前先ABC机器添加hosts格式为 IP 计算机名字
vim /etc/hosts
192.168.195.131 one
192.168.195.132 two
192.168.195.133 three
5.A/B/C三台机器修改配置文件
vim /etc/salt/minion
修改:
master: one 默认是注释的把注释取消,改为中控中心的计算机名字
6.A机器启动salt-master和salt-minion
7.B/C 机器启动salt-minion
8.检查ABC三台机器服务是否有启动
ps aux |grep salt
9.查看服务端的端口
netstat -lntp
默认是监听2个端口4505和4506,4505为消息发布的端口,4506为和客户端通信
1.添加主机:
[root@one ~]# salt-key -a two -y
The following keys are going to be accepted:
Unaccepted Keys:
two
Key for minion two accepted.
[root@one ~]# salt-key
Accepted Keys:
two
Denied Keys:
Unaccepted Keys:
one
three
Rejected Keys:
2.添加完后去看下/etc/salt/pki/master/minions有没有生成秘钥
[root@one ~]# ls /etc/salt/pki/master/minions
two
[root@one ~]# cat /etc/salt/pki/master/minions/two
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyMUtZRnr1UDu2qeCwPs+
v0P3c0+ni/6PmneVWEmFQrY481Tv40foegQEYWXCg0ilGWXg7v1GykNTd/ogcml4
RVvh/rxWlACHpjTfcI/CcSIdVnte+Zc3TH+Q8dA6svAdI66KTk0LtmFdotX6YTaF
f+3ZZJV65hT6m6KW6NUizx6iFDeNe8RuZBwMO2CjvvqPVpQKulCum3F7hLL//XO3
AFEdDbjLEZu3uA3UiLKoxXdzD2uZAIRonsUWC+wnoZPtuaHT0LiEcetRgB3bsG/z
mCYuDAPBL2pVxQ109ESRklGPfqm2lUSO9TwGwyOtE5pnhSa3bnzLaSSjiuby2LaR
nwIDAQAB
-----END PUBLIC KEY-----
以下为一些增、删、拒绝交互的操作:
增加格式为:-a为增加指定主机 -y为确认
salt-key -a 后面跟主机名 -y
删除格式为:-d为删除指定主机 -y为确认
salt-key -d 后面跟主机名 -y
拒绝指定主机:
拒绝格式为:-r 拒绝指定主机 -y为确认
salt-key -r 后面跟主机名 -y
另类格式:
-A:增加所有
-D:删除所有
-R:拒绝所有
以上在服务端执行操作
在中控中心执行命令操作2他客户端机器
使用正则表达式需要加-E
salt '*' test.ping //*表示所有机器,也可以单独指定单台机器
//test.ping,类似ping命令
three:
True
two:
True
执行远程命令:
salt '*' cmd.run "ls /tmp" //远程执行ls查看命令
three:
ks-script-WPyixb
systemd-private-32d8dcb55c30452e852fcb267f1c9893-chronyd.service-zY1FLY
vmware-root
yum.log
two:
ks-script-WPyixb
systemd-private-5e7b85913f5540fe91c5d5386a949e2a-chronyd.service-EnYzK1
vmware-root
yum.log
支持正则表达式:
salt 'tw*' cmd.run "ls /tmp"
two:
ks-script-WPyixb
systemd-private-5e7b85913f5540fe91c5d5386a949e2a-chronyd.service-EnYzK1
vmware-root
yum.log
grains是在minion启动时收集到的一些信息,比如操作系统类型、网卡ip、内核版本、cpu架构等
[root@one ~]# salt 'two' grains.ls //列出系统的一些项目,这里只列出一部分
two:
- SSDs
- biosreleasedate
- biosversion
- cpu_flags
- cpu_model
- cpuarch
- disks
- dns
- domain
- fqdn
- fqdn_ip4
- fqdn_ip6
列出系统项目的值
salt 'two' grains.items
id:
two
init:
systemd
ip4_gw:
192.168.195.5
ip4_interfaces:
----------
ens33:
- 192.168.195.130
- 192.168.195.132
lo:
- 127.0.0.1
示例:
minion上:
vim /etc/salt/grains //添加:
role: nginx (nginx前面有个空格)
env: test
重启minion服务
systemctl restart salt-minion
master上获取grains:可以看到刚刚我们自定义的值
salt '*' grains.item role env
[root@one ~]# salt '*' grains.item role env
three:
----------
env:
test
role:
two:
----------
env:
test
role:
nginx
可以借助grains的一些属性信息分组管理机器
salt -G role:nginx cmd.run 'ls /tmp/'
[root@one ~]# salt -G env:test cmd.run 'ls /tmp'
three:
ks-script-WPyixb
systemd-private-32d8dcb55c30452e852fcb267f1c9893-chronyd.service-zY1FLY
vmware-root
yum.log
two:
ks-script-WPyixb
systemd-private-5e7b85913f5540fe91c5d5386a949e2a-chronyd.service-EnYzK1
vmware-root
yum.log
pillar和grains不一样,是在master上定义的,并且是针对minion定义的一些信息。像一些比较重要的数据(密码)可以存在pillar里,还可以定义变量等。
1.vim /etc/salt/master
修改如下:
pillar_roots: 这三行去掉注释,主要格式,第二行前面有2个空格,第3行前面有4个空格
base:
- /srv/pillar //自定义项目
2.重启服务:只要需改master上的配置文件就要重启服务
systemctl restart salt-master
3.创建项目目录
mkdir /srv/pillar
4.在pillar目录里创建子配置文件:
vim test.sls
dir: /etc/123
conf: /etc/456.conf
5.创建一个入口:增加机器
vim top.sls //这里主要格式注意空格,
base:
'two': //机器名字
- test //要加载的配置文件
'three':
- test
6.这里不用重启服务只需要刷新下pillar配置获取新的状态
salt '*' saltutil.refresh_pillar
7.验证
salt '*' pillar.item conf dir //这样就自定义好了pillar
[root@one pillar]# salt '*' pillar.item dir conf
two:
----------
conf:
/etc/456.conf
dir:
/etc/123
three:
----------
conf:
/etc/456.conf
dir:
/etc/123
同样pillar也支持匹配对象不过要加上-I ,grains的是加-G
总结:pillar个人认为就像grains,只不过grains是在minion上去配置,可能有点繁琐,在master上配置pillar比较批量的去部署
1.修改master配置文件
vim /etc/salt/master
修改如下:
file_roots:
base: //前面2个空格
- /srv/httpd/ //自定义项目名字,前面4个空格
2.创建文件
mkdir /srv/httpd
3.定义入口文件
vim top.sls
base:
'two': //首行2个空格,定义机器
- httpd //首行4个空格,定义子配置文件
4.定义子配置文件(要安装的配置)
httpd-service: //名字自定义
pkg.installed: //salt的一个安装模块,类似cmd.run
- names: //定义要安装的包,names是必须这样写
- httpd
- httpd-devel
service.running: //保证指定的服务启动的模块
- name: httpd //服务名字
- enable: True //启动,false表示不启动
5.重启master服务
systemctl start salt-master
6.执行命令安装
salt 'two' state.highstate //这里他会执行过程比较慢,他会到所在的目录去搜索top文件去安装
7.查看two机器是否安装了httpd
tcp6 0 0 :::80 :::* LISTEN 4032/httpd //这里看到了启动了httpd服务
示例:
1.在master上加入子配置文件
vim /srv/httpd/file.sls
加入如下内容
file_test:
file.managed: 要加载的模块
- name: /tmp/test.txt 目地路径
- source: salt://test.txt 来源路径
- user: root 文件用户
- group: root 文件属组
- mode: 600 文件权限
##这里介绍下salt:// 这个指的是在 /etc/salt/master 上的:如下等于salt:// = /srv/httpd/
你可以把它当做快捷键,默认会这里找,要在这个目录下才行,salt是必须加的
file_roots:
base:
- /srv/httpd/
2.定义top.sls 入口
更改如下:
base:
'two': 要执行的机器
- file 要执行的子配置文件
3.运行命令进行推送
salt 'two' state.highstate
过程如下:一般不冒红色都正常
two:
----------
ID: file_test
Function: file.managed
Name: /tmp/test.txt
Result: True
Comment: File /tmp/test.txt updated
Started: 23:29:25.672746
Duration: 108.817 ms
Changes:
----------
diff:
New file
Summary for two
------------
Succeeded: 1 (changed=1)
Failed: 0
------------
Total states run: 1
Total run time: 108.817 ms
4.检查two机器是否已成功推送
[root@two tmp]# ls /tmp/test.txt
/tmp/test.txt
目录跟文件要运行不同模块,就好像你cp命令,cp目录需要加-r才能cp
示例:
##推送目录跟推送文件一样,只不过使用的模块不一样
1.加入子配置文件内容:
vim /srv/httpd/dir.sls
加入如下内容:
file_dir:
file.recurse: 这里使用recure模块
- name: /tmp/dir 目地路径
- source: salt://dir 来源目录
- user: root
- file_mode: 640 文件权限
- dir_mode: 750 目录权限
- mkdir: True 是否自动创建
- clean: True 加上他后源删除文件或目录,目标也会跟着删除,否则不会删除
这里要注意一点,推送的目录如果为空,默认是不会推送的,必须里面有文件或子目录,子目录也必须要有文件。
2.编写top.sls文件
base:
'two':
- dir
3.推送
salt 'two' state.highstate
过程如下:
two:
----------
ID: file_dir
Function: file.recurse
Name: /tmp/dir
Result: True
Comment: Recursively updated /tmp/dir
Started: 23:41:44.271759
Duration: 192.032 ms
Changes:
----------
/tmp/dir/123.txt:
----------
diff:
New file
mode:
0640
Summary for two
------------
Succeeded: 1 (changed=1)
Failed: 0
------------
Total states run: 1
Total run time: 192.032 ms
4.查看two机器是否有dir目录
[root@two tmp]# ls /tmp/dir/
123.txt
cmd.run虽然可以实现,但是如果命令多的话就不好操作了,为了方便这点,我们可以利用脚本的形式节省时间。
1.加入子配置文件
vim shell.sls
加入如下内容:
shell_test:
cmd.script: 加载的模块
- source: salt://1.sh 要运行的脚本
- user: root 运行的用户
2.编写1.sh脚本
#!/bin/bash
touch /tmp/111.txt
if [ ! -d /tmp/1233 ]
then
mkdir /tmp/1233
fi
3.加入top.sls
base:
'two':
- shell
4.运行
salt 'two' state.highstate
运行过程:
two:
----------
ID: shell_test
Function: cmd.script
Result: True
Comment: Command 'shell_test' run
Started: 23:50:15.363437
Duration: 94.51 ms
Changes:
----------
pid:
2492
retcode:
0
stderr:
stdout:
Summary for two
------------
Succeeded: 1 (changed=1)
Failed: 0
------------
Total states run: 1
Total run time: 94.510 ms
示例:
1.编写子配置文件
vim cron.sls
加入如下内容:
cron_test:
cron.present: 加载的模块
- name: /bin/touch /tmp/abc.txt 运行的命令,类似crond的格式
- user: root 执行的用户
- minute: '*' 分
- hour: 20 时
- daymonth: '*' 日
- month: '*' 月
- dayweek: '*' 周
2.修改top.sls
base:
'two':
- cron
3.执行
salt 'two' state.highstate
过程如下:
two:
----------
ID: cron_test
Function: cron.present
Name: /bin/touch /tmp/abc.txt
Result: True
Comment: Cron /bin/touch /tmp/abc.txt added to root's crontab
Started: 23:55:27.868180
Duration: 302.842 ms
Changes:
----------
root:
/bin/touch /tmp/abc.txt
Summary for two
------------
Succeeded: 1 (changed=1)
Failed: 0
------------
Total states run: 1
Total run time: 302.842 ms
4.查看two机器的任务计划
# Lines below here are managed by Salt, do not edit
# SALT_CRON_IDENTIFIER:/bin/touch /tmp/abc.txt
* 20 * * * /bin/touch /tmp/abc.txt
这里要注意:不要删除带#号的标签注释,否则推送的时候会再次推送
知道了添加也要学会删除:
以下删除方法:
1.编辑cron.sls删掉全部内容
加入如下:
cron_test:
cron.absent: 模块 注意格式
- name: /bin/touch /tmp/abc.txt
2.执行命令
salt 'two' state.highstate
过程如下:
two:
----------
ID: cron_test
Function: cron.absent
Name: /bin/touch /tmp/abc.txt
Result: True
Comment: Cron /bin/touch /tmp/abc.txt removed from root's crontab
Started: 00:09:02.093930
Duration: 327.933 ms
Changes:
----------
root:
/bin/touch /tmp/abc.txt
Summary for two
------------
Succeeded: 1 (changed=1)
Failed: 0
------------
Total states run: 1
Total run time: 327.933 ms
3.查看是否删除:
[root@two tmp]# crontab -l
# Lines below here are managed by Salt, do not edit
可以看到删除了!
拷贝master上的文件到minion上
[root@one httpd]# salt 'two' cp.get_file salt://1.sh /tmp/2.sh two: /tmp/2.sh
拷贝master上的目录到minion上
[root@one httpd]# salt 'two' cp.get_dir salt://dir /tmp/rid two: - /tmp/rid/dir/123.txt
以上2个只是换了个单词~~cp.get_file/dir
[root@one httpd]# salt-run manage.up - three - two
[root@one httpd]# salt 'three' cmd.script salt://1.sh three: ---------- pid: 1501 retcode: 0 stderr: stdout:
salt-ssh不需要对客户端做认证,客户端也不用安装salt-minion,它类似ssh/expec
1.安装salt-ssh
yum install -y salt-ssh
2.编写roster配置文件
按照格式填写:注意空格
two:
host: 192.168.195.133
user: root
passwd: XXX
three:
host: 192.168.195.133
user: root
passwd: xxx
3.启动服务:
//这里的key-deploy意思是自动把本机的公钥放到对方机器上实现通信
//-r是run 执行命令 W
salt-ssh --key-deploy '*' -r 'w'
过程如下,先把公钥传输
hree:
----------
retcode:
254
stderr:
stdout:
The host key needs to be accepted, to auto accept run salt-ssh with the -i flag:
The authenticity of host '192.168.195.133 (192.168.195.133)' can't be established.
ECDSA key fingerprint is SHA256:bmaeeb4Iz6HNVp2ihovKQp6N5J/mZ8f4A8QaChS4Kww.
ECDSA key fingerprint is MD5:bf:3e:4d:29:65:99:28:81:6a:01:4c:eb:8d:f4:be:8c.
Are you sure you want to continue connecting (yes/no)?
two:
----------
retcode:
254
stderr:
stdout:
The host key needs to be accepted, to auto accept run salt-ssh with the -i flag:
The authenticity of host '192.168.195.133 (192.168.195.133)' can't be established.
ECDSA key fingerprint is SHA256:bmaeeb4Iz6HNVp2ihovKQp6N5J/mZ8f4A8QaChS4Kww.
ECDSA key fingerprint is MD5:bf:3e:4d:29:65:99:28:81:6a:01:4c:eb:8d:f4:be:8c.
Are you sure you want to continue connecting (yes/no)?
这上面提示第一次ssh连接需要输入yes,也可以先ssh 到该机器点个确认
4.然后再执行salt-ssh --key-deploy '*' -r 'w'
[root@one httpd]# salt-ssh --key-deploy '*' -r 'w'
three:
----------
retcode:
0
stderr:
stdout:
01:02:42 up 1:45, 1 user, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 192.168.195.1 23:18 46:26 0.02s 0.02s -bash
two:
----------
retcode:
0
stderr:
stdout:
01:02:42 up 1:45, 1 user, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 192.168.195.1 23:18 46:26 0.02s 0.02s -bash