传统运维缺点
Puppet
(www.puppetlabs.com)基于rubby开发,c/s架构,支持多平台,可管理配置文件、用户、cron任务、软件包、系统服务等。 分为社区版(免费)和企业版(收费),企业版支持图形化配置。
Saltstack
(官网 https://saltstack.com,文档docs.saltstack.com )基于python开发,c/s架构,支持多平台,比puppet轻量,在远程执行命令时非常快捷,配置和使用比puppet容易,能实现puppet几乎所有的功能。
Ansible
(www.ansible.com )更加简洁的自动化运维工具,不需要在客户端上安装agent,基于python开发。可以实现批量操作系统配置、批量程序的部署、批量运行命令。
saltstack介绍文档 https://docs.saltstack.com/en/latest/topics/index.html
saltstack最新yum源 https://repo.saltstack.com/#rhel
可以使用salt-ssh远程执行,类似ansible,也支持c/s模式。
环境:
192.168.157.128
zyj01
既做服务端 也做客户端192.168.157.130
zyj02
做客户端[root@zyj01 ~]# hostnamectl set-hostname zyj01
[root@zyj02 ~]# hostnamectl set-hostname zyj02
vim /etc/hosts
增加以下内容:
192.168.157.128 zyj01
192.186.157.130 zyj02
[root@zyj01 ~]# yum install -y http://repo.saltstack.com/yum/redhat/salt-repo-latest-2.el7.noarch.rpm
yum install -y salt-master salt-minion
yum install -y salt-minion
[root@zyj01 ~]# vim /etc/salt/minion
在配置文件中取消注释,并修改内容如下:
master: zyj01
[root@zyj01 ~]# systemctl start salt-minion
[root@zyj01 ~]# systemctl start salt-master
[root@zyj02 ~]# vim /etc/salt/minion
在配置文件中取消注释,并修改内容如下:
master: zyj01
[root@zyj02 ~]# systemctl start salt-minion
[root@zyj01 ~]# netstat -lntp |grep python
tcp 0 0 0.0.0.0:4505 0.0.0.0:* LISTEN 2253/python
tcp 0 0 0.0.0.0:4506 0.0.0.0:* LISTEN 2259/python
服务端上监听4505和4506两个端口,4505是消息发布的端口,4506是和客户端通信的端口。客户端上是不会监听端口的。
master端和minion端通信需要建立一个安全通道,传输过程需要加密,所以得配置认证,也是通过密钥对来加密解密的
minion在第一次启动时会在/etc/salt/pki/minion/下生成minion.pem和minion.pub,其中.pub为公钥,它会把公钥传输给master
[root@zyj02 ~]# ls /etc/salt/pki/minion/
minion.pem minion.pub
master第一次启动时也会在/etc/salt/pki/master下生成密钥对,当master接收到minion传过来的公钥后,通过salt-key工具接受这个公钥,一旦接受后就会在/etc/salt/pki/master/minions/目录里存放刚刚接受的公钥,同时客户端也会接受master传过去的公钥,把它放在/etc/salt/pki/minion目录下,并命名为minion_master.pub
[root@zyj01 ~]# ls /etc/salt/pki/master/
master.pem master.pub minions minions_autosign minions_denied minions_pre minions_rejected
salt-key
:saltstack认证工具-a
后面跟主机名,认证指定主机-A
认证所有主机-r
跟主机名,拒绝指定主机-R
拒绝所有主机-d
跟主机名,删除指定主机认证-D
删除全部主机认证-y
省略掉交互,相当于直接按了ysalt-key
可以查看所有minion的认证状态[root@zyj01 ~]# salt-key
Accepted Keys:
Denied Keys:
Unaccepted Keys:
zyj01
zyj02
Rejected Keys:
-y
省略交互salt-key -a 主机名
[root@zyj01 ~]# salt-key -a zyj01 -y
The following keys are going to be accepted:
Unaccepted Keys:
zyj01
Key for minion zyj01 accepted.
salt-key -r 主机名
[root@zyj01 ~]# salt-key -r zyj02 ##拒绝zyj02
The following keys are going to be rejected:
Unaccepted Keys:
zyj02
Proceed? [n/Y] y
Key for minion zyj02 rejected.
salt-key -d 主机名
[root@zyj01 ~]# salt-key -d zyj01 -y ##删除zyj01
The following keys are going to be deleted:
Accepted Keys:
zyj01
Key for minion zyj01 deleted.
salt-key -A
[root@zyj01 ~]# salt-key -A ##认证所有机器
The following keys are going to be accepted:
Unaccepted Keys:
zyj01
zyj02
Proceed? [n/Y] y
Key for minion zyj01 accepted.
Key for minion zyj02 accepted.
[root@zyj01 ~]# salt-key ##查看认证状态
Accepted Keys:
zyj01
zyj02
Denied Keys:
Unaccepted Keys:
Rejected Keys:
salt '主机名' testping
[root@zyj01 ~]# salt '*' test.ping
zyj02:
True
zyj01:
True
satl '主机名' cmd.run "命令"
[root@zyj01 ~]# salt '*' cmd.run "hostname"
zyj02:
zyj02
zyj01:
zyj01
*必须是在master上已经被接受过认证的客户端,可以通过salt-key查到。关于这部分内容,它支持通配、列表以及正则。
[root@zyj01 ~]# salt 'zyj*' cmd.run "hostname"
zyj02:
zyj02
zyj01:
zyj01
选项-E
表示使用正则
[root@zyj01 ~]# salt -E 'zyj0\d' cmd.run "hostname" ##\d等于[0-9]
zyj02:
zyj02
zyj01:
zyj01
选项-L
使用列表 多个机器用逗号分隔
[root@zyj01 ~]# salt -L 'zyj01,zyj02' test.ping
zyj02:
True
zyj01:
True
1.格式:salt -G 键:值
[root@zyj01 pillar]# salt -G role:web test.ping
zyj02:
True
salt -I '键:值'
[root@zyj01 pillar]# salt -I 'conf:/etc/123.conf' test.ping
zyj01:
True
grains是在minion启动时收集到的一些信息,比如操作系统类型、网卡ip、内核版本、cpu架构等。
grains的信息并不是动态的,并不会实时变更,它是在minion启动时收集到的。
salt '主机名' grains.ls
[root@zyj01 ~]# salt '*' grains.ls
zyj02:
- SSDs
- biosreleasedate
- biosversion
salt '主机名' grains.items
[root@zyj01 ~]# salt '*' grains.items
zyj02:
----------
SSDs:
biosreleasedate:
07/31/2013
biosversion:
6.00
步骤
[root@zyj02 ~]# vim /etc/salt/grains
添加以下内容:
role: web ##一个key对应一个value
env: test
[root@zyj02 ~]# systemctl restart salt-minion
[root@zyj01 ~]# salt '*' grains.item role env ##列出所有grains是role env的值
zyj02:
----------
env:
test
role:
web
zyj01:
----------
env:
role:
grains
中role
是web
的主机运行命令w
格式: salt -G 定义的k-v cmd.run '命令'
[root@zyj01 ~]# salt -G role:web cmd.run 'w'
zyj02:
17:17:49 up 6:54, 1 user, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 192.168.157.1 10:24 4:13 0.03s 0.03s -bash
pillar和grains不一样,是在master上定义的,并且是针对minion定义的一些信息。像一些比较重要的数据(密码)可以存在pillar里,还可以定义变量等。在master上给客户机打标签,更加安全。
配置自定义pillar
[root@zyj01 ~]# vim /etc/salt/master
去掉下面参数的注释#
pillar_roots:
base: ##空两格
- /srv/pillar ##空四格
/srv/pillar
目录,/srv/pillar
目录用于存放pillar文件[root@zyj01 ~]# mkdir /srv/pillar
[root@zyj01 ~]# cd /srv/pillar/ #移动至/srv/pillar/
[root@zyj01 pillar]# vim top.sls #创建并编辑top.sls文件,salt都会先通过该配置文件去调用pillar的相关定义文件。
增加内容如下:
base:
'zyj01': ##空两格,定义主机
- test ##空四格,定义调用的文件名称
'zyj02': ##空两格,定义主机
- test2 ##空四格,定义调用的文件名称
[root@zyj01 pillar]# vim test.sls
添加内容如下:
conf: /etc/123.conf
[root@zyj01 pillar]#vim test2.sls
添加内容如下:
conf: /etc/123aa.conf
3.重启salt-master服务
[root@zyj01 pillar]# systemctl restart salt-master
格式:salt '主机名' saltutil.refresh_pillar
[root@zyj01 pillar]# salt '*' saltutil.refresh_pillar
zyj02:
True
zyj01:
True
格式:salt '主机名' pillar.item 键
[root@zyj01 pillar]# salt '*' pillar.item conf
zyj01:
----------
conf:
/etc/123.conf
zyj02:
----------
conf:
/etc/123aa.conf
[root@zyj01 ~]# vim /etc/salt/master
把下面参数#去掉,依然要留空格1、2、4
file_roots:
base:
- /srv/salt/
[root@zyj01 ~]# systemctl restart salt-master
[root@zyj01 ~]# mkdir /srv/salt
[root@zyj01 ~]# cd /srv/salt/
[root@zyj01 salt]# vim top.sls
base:
'*':
- httpd
[root@zyj01 salt]# vim httpd.sls
httpd-service:
pkg.installed:
- names:
- httpd
- httpd-devel
service.running:
- name: httpd
- enable: True
httpd-service是id的名字,自定义的。pkg.installed 为包安装函数,下面是要安装的包的名字。service.running也是一个函数,来保证指定的服务启动,enable表示开机启动。
格式:salt '主机名' state.highstate
[root@zyj01 salt]# salt 'zyj02' state.highstate
zyj02:
----------
ID: httpd-service
Function: pkg.installed
Name: httpd
Result: True
Comment: The following packages were installed/updated: httpd
Started: 21:25:04.019004
Duration: 106613.517 ms
[root@zyj02 ~]# ps aux |grep httpd
root 4395 0.1 0.4 224020 4992 ? Ss 21:27 0:00 /usr/sbin/httpd -DFOREGROUND
apache 4396 0.0 0.2 224020 2952 ? S 21:27 0:00 /usr/sbin/httpd -DFOREGROUND
[root@zyj02 ~]# netstat -lntp |grep 80
tcp6 0 0 :::80 :::* LISTEN 4395/httpd
在centOS7中/lib/systemd/system/是存放服务service文件的目录
[root@zyj02 ~]# ls /lib/systemd/system/httpd.service
/lib/systemd/system/httpd.service
[root@zyj01 ~]# vim /etc/salt/master
把下面参数#去掉
file_roots:
base:
- /srv/salt/
[root@zyj01 ~]# systemctl restart salt-master
[root@zyj01 ~]# mkdir /srv/salt
[root@zyj01 ~]# cd /srv/salt/
[root@zyj01 salt]# vim top.sls
内容如下:
base:
'*':
- file
[root@zyj01 salt]# vim file.sls
内容如下:
file_test:
file.managed:
- name: /tmp/zyj.txt
- source: salt://test/1.txt
- user: root
- group: root
- mode: 600
第一行的file_test为自定的名字,表示该配置段的名字,managed文件管理模块 name指定客户机的文件路径 source指定文件从哪里拷贝,salt://test/1.txt相当于是/srv/salt/test/1.txt file
[root@zyj01 salt]# mkdir test
[root@zyj01 salt]# echo "111" > test/1.txt
[root@zyj01 salt]# salt 'zyj02' state.highstate
zyj02:
----------
ID: file_test
Function: file.managed
Name: /tmp/zyj.txt
Result: True
查看zyj02上是否有zyj.txt文件
[root@zyj02 ~]# ll -a /tmp/zyj.txt
-rw------- 1 root root 4 9月 8 21:59 /tmp/zyj.txt
[root@zyj02 ~]# cat /tmp/zyj.txt
111
步骤
[root@zyj01 ~]# cd /srv/salt/
[root@zyj01 salt]# vim top.sls
内容如下:
base:
'*':
- dir
[root@zyj01 salt]# vim dir.sls
file_dir:
file.recurse:
- name: /tmp/testdir
- source: salt://test/123
- user: root
- file_mode: 640
- dir_mode: 750
- mkdir: True
- clean: True
clean加上它之后,源删除文件或目录,目标也会跟着删除,否则不会删除
[root@zyj01 salt]# mkdir test/123
[root@zyj01 salt]# salt 'zyj02' state.highstate
zyj02:
----------
ID: file_dir
Function: file.recurse
Name: /tmp/testdir
[root@zyj02 ~]# ll -ad /tmp/testdir/
drwxr-x--- 2 root root 6 9月 9 11:25 /tmp/testdir/
[root@zyj01 salt]# mkdir test/123/11
[root@zyj01 salt]# touch test/123/11.txt
[root@zyj01 salt]# ls test/123/
11 11.txt
再次分发
[root@zyj01 salt]# salt 'zyj02' state.highstate
[root@zyj02 ~]# ls /tmp/testdir/
11.txt
saltstack只分发了文件,空目录不会被分发
[root@zyj01 salt]# touch test/123/11/1.txt
[root@zyj01 salt]# salt 'zyj02' state.highstate
[root@zyj02 ~]# ls /tmp/testdir/ ##有11目录
11 11.txt
目录为非空目录时会被分发
步骤
[root@zyj01 salt]# vim top.sls
内容如下:
base:
'*':
- shell
[root@zyj01 salt]# vim shell.sls
内容如下:
shell_test:
cmd.script:
- source: salt://test/1.sh
- user: root
[root@zyj01 salt]# vim test/1.sh
内容如下:
#!/bin/bash
touch /tmp/1122.txt
if [ ! -d /tmp/1122 ]
then
mkdir /tmp/1122
fi
[root@zyj01 salt]# salt 'zyj02' state.highstate
[root@zyj02 ~]# ls /tmp/
1122
1122.txt
用saltstack把计划任务分发到客户机上执行
步骤
[root@zyj01 salt]# vim top.sls
内容如下:
base:
'*':
- cron
[root@zyj01 salt]# vim cron.sls
内容如下:
cron_test:
cron.present:
- name: /bin/bash /tmp/111.txt
- user: root
- minute: '*'
- hour: 20
- daymonth: '*'
- month: '*'
- dayweek: '*'
*需要用单引号引起来。当然我们还可以使用file.managed模块来管理cron,因为系统的cron都是以配置文件的形式存在的。
[root@zyj01 salt]# salt 'zyj02' state.highstate
[root@zyj02 ~]# crontab -l
# Lines below here are managed by Salt, do not edit
# SALT_CRON_IDENTIFIER:/bin/bash /tmp/111.txt
* 20 * * * /bin/bash /tmp/111.txt
提示:# Lines below here are managed by Salt, do not edit 不能改动他们,否则就不能通过salt来管理这个任务计划
[root@zyj01 salt]# vim cron.sls
内容如下
cron_test:
cron.absent:
- name: /bin/bash /tmp/111.txt
[root@zyj01 salt]# salt 'zyj02' state.highstate
[root@zyj02 ~]# crontab -l
# Lines below here are managed by Salt, do not edit
格式:salt-run manage.up
[root@zyj01 salt]# salt-run manage.up
- zyj01
- zyj02
格式:salt '主机名' cp.get_file salt://原文件 目标文件
[root@zyj01 salt]# salt '*' cp.get_file salt://test/1.txt /tmp/123.txt
zyj02:
/tmp/123.txt
zyj01:
/tmp/123.txt
格式:salt '主机名' cp.get_dir salt://原目录 目标目录
[root@zyj01 salt]# salt '*' cp.get_dir salt://test/123 /tmp/
zyj01:
- /tmp//123/11.txt
- /tmp//123/11/1.txt
zyj02:
- /tmp//123/11.txt
- /tmp//123/11/1.txt
格式:salt '主机名' cmd.script salt://原脚本路径
[root@zyj01 salt]# salt '*' cmd.script salt://test/1.sh
zyj02:
----------
pid:
2493
retcode:
0
stderr:
stdout:
zyj01:
----------
pid:
7470
retcode:
0
stderr:
stdout:
步骤
[root@zyj01 ~]# yum install -y http://repo.saltstack.com/yum/redhat/salt-repo-latest-2.el7.noarch.rpm
[root@zyj01 ~]# yum install -y salt-ssh
[root@zyj01 ~]# vim /etc/salt/roster
添加下面参数:
zyj01:
host: 192.168.157.128
user: root
passwd: 38003800
zyj02:
host: 192.168.157.130
user: root
passwd: 38003800
格式:salt-ssh [--key-deploy] '主机名' -r '命令'
[root@zyj01 ~]# salt-ssh --key-deploy '*' -r 'hostname'
zyj02:
----------
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.157.130 (192.168.157.130)' can't be established.
ECDSA key fingerprint is SHA256:2dycAKJ+5BsHwXALskxaqtyNdNwRCFReWhmwJ2peUu0.
ECDSA key fingerprint is MD5:00:30:54:23:97:64:c3:1d:ee:65:a0:99:0f:f9:28:5c.
Are you sure you want to continue connecting (yes/no)?
这里需要先ssh登录机器确认 --key-deploy是第一次执行把公钥放到客户机上
[root@zyj01 ~]# salt-ssh --key-deploy '*' -r 'hostname'
zyj02:
----------
retcode:
0
stderr:
stdout:
zyj02
zyj01:
----------
retcode:
0
stderr:
stdout:
zyj01
ssh认证成功之后可以把配置文件中密码行给删除
[root@zyj01 ~]# vim /etc/salt/roster
删除密码:
zyj01:
host: 192.168.157.128
user: root
zyj02:
host: 192.168.157.130
user: root
[root@zyj01 ~]# salt-ssh '*' -r 'w'
zyj02:
----------
retcode:
0
stderr:
stdout:
15:16:49 up 4:08, 1 user, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 192.168.157.1 11:18 2:55m 0.04s 0.04s -bash
zyj01:
----------
retcode:
0
stderr:
stdout:
15:16:49 up 4:08, 1 user, load average: 0.32, 0.16, 0.08
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 192.168.157.1 11:18 1.00s 0.71s 0.01s /usr/bin/python /usr/bin/salt-ssh * -r w