文章目录
- 一、自动化运维介绍
- 二、saltstack安装
- 三、启动salt相关服务
- 四、saltstack配置认证
- 五、saltstack远程执行命令
- 六、grains
- 七、pillar
- 八、安装配置httpd
- 九、配置管理文件
- 十、配置管理目录
- 十一、配置管理远程命令
- 十二、 配置管理计划任务
- 十三、其他命令
- 十四、salt-ssh使用
一、自动化运维介绍
- 传统运维缺点
- 传统运维效率低,大多工作人为完成
- 传统运维工作繁琐,容易出错
- 传统运维每日重复做相同的事情
- 传统运维没有标准化流程
- 传统运维的脚本繁多,不能方便管理
- 自动化运维就是要解决上面所有问题
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安装
- 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
做客户端
- 为两台机器设置hostname
[root@zyj01 ~]# hostnamectl set-hostname zyj01
[root@zyj02 ~]# hostnamectl set-hostname zyj02
- 分别在俩台机器上设置hosts
vim /etc/hosts
增加以下内容:
192.168.157.128 zyj01
192.186.157.130 zyj02
- 分别为两台机器安装saltstack yum源(可以在官方文档中找到最新的版本)
[root@zyj01 ~]# yum install -y http://repo.saltstack.com/yum/redhat/salt-repo-latest-2.el7.noarch.rpm
- 在128(zyj01)上安装salt-master(服务端)和salt-minion
yum install -y salt-master salt-minion
- 在130(zyj02)上安装salt-minion
yum install -y salt-minion
三、启动salt相关服务
- 在zyj01上编辑minion配置文件/etc/salt/minion
[root@zyj01 ~]# vim /etc/salt/minion
在配置文件中取消注释,并修改内容如下:
master: zyj01
- 在zyj上启动master和minion
[root@zyj01 ~]# systemctl start salt-minion
[root@zyj01 ~]# systemctl start salt-master
- 在zyj02上编辑minion配置文件启动服务
[root@zyj02 ~]# vim /etc/salt/minion
在配置文件中取消注释,并修改内容如下:
master: zyj01
- 在zyj02上启动minion服务
[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是和客户端通信的端口。客户端上是不会监听端口的。
四、saltstack配置认证
- saltstack认证过程
master端和minion端通信需要建立一个安全通道,传输过程需要加密,所以得配置认证,也是通过密钥对来加密解密的
minion在第一次启动时会在/etc/salt/pki/minion/下生成minion.pem和minion.pub,其中.pub为公钥,它会把公钥传输给master
- minion端存放私钥和公钥的路径
[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
省略掉交互,相当于直接按了y
- 直接使用 命令
salt-key
可以查看所有minion的认证状态
[root@zyj01 ~]# salt-key
Accepted Keys:
Denied Keys:
Unaccepted Keys:
zyj01
zyj02
Rejected Keys:
- 认证主机zyj01,可以在主机名后面添加选项
-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.
- 拒绝认证主机zyj02
- 格式:
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.
- 删除认证的主机zyj01
- 格式:
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:
五、saltstack远程执行命令
- 测试客户端网络
- 格式:
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
- 用grains匹配主机
1.格式:salt -G 键:值
[root@zyj01 pillar]# salt -G role:web test.ping
zyj02:
True
- 用pillar匹配主机
- 格式:
salt -I '键:值'
[root@zyj01 pillar]# salt -I 'conf:/etc/123.conf' test.ping
zyj01:
True
六、grains
grains是在minion启动时收集到的一些信息,比如操作系统类型、网卡ip、内核版本、cpu架构等。
grains的信息并不是动态的,并不会实时变更,它是在minion启动时收集到的。
- 列出所有的grains项目名字
- 格式:
salt '主机名' grains.ls
[root@zyj01 ~]# salt '*' grains.ls
zyj02:
- SSDs
- biosreleasedate
- biosversion
- 列出所有grains项目以及值
- 格式:
salt '主机名' grains.items
[root@zyj01 ~]# salt '*' grains.items
zyj02:
----------
SSDs:
biosreleasedate:
07/31/2013
biosversion:
6.00
- grains支持自定义信息,等于给主机打标签
步骤
- 在zyj02上添加自定义grains信息
[root@zyj02 ~]# vim /etc/salt/grains
添加以下内容:
role: web ##一个key对应一个value
env: test
- 重启minion服务
[root@zyj02 ~]# systemctl restart salt-minion
- 在zyj01上根据grains信息执行命令
[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
pillar和grains不一样,是在master上定义的,并且是针对minion定义的一些信息。像一些比较重要的数据(密码)可以存在pillar里,还可以定义变量等。在master上给客户机打标签,更加安全。
- 配置自定义pillar
- 步骤
- 配置master配置文件
[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 ##空四格,定义调用的文件名称
- 创建top.sls文件中定义的文件
[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
- 刷新pillar配置
格式:salt '主机名' saltutil.refresh_pillar
[root@zyj01 pillar]# salt '*' saltutil.refresh_pillar
zyj02:
True
zyj01:
True
- 查看特定pillar的值
格式:salt '主机名' pillar.item 键
[root@zyj01 pillar]# salt '*' pillar.item conf
zyj01:
----------
conf:
/etc/123.conf
zyj02:
----------
conf:
/etc/123aa.conf
八、安装配置httpd
- 使用saltstack来安装软件包 centOS默认使用yum安装
步骤
- 配置master配置文件
[root@zyj01 ~]# vim /etc/salt/master
把下面参数#去掉,依然要留空格1、2、4
file_roots:
base:
- /srv/salt/
- 重启salt-master服务
[root@zyj01 ~]# systemctl restart salt-master
- 创建/srv/salt目录
[root@zyj01 ~]# mkdir /srv/salt
- 创建主配置文件
[root@zyj01 ~]# cd /srv/salt/
[root@zyj01 salt]# vim top.sls
base:
'*':
- httpd
- 创建具体的安装配置文件httpd.sls,格式依然留空格1、2、4、6
[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表示开机启动。
- 执行安装httpd包
格式: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
- 查看zyj02上是否安装http服务
[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
九、配置管理文件
- 在服务端使用saltstack存放模板文件再分发到其他客户机上
步骤
- 配置master的salt的主配置文件
[root@zyj01 ~]# vim /etc/salt/master
把下面参数#去掉
file_roots:
base:
- /srv/salt/
- 重启salt-master服务
[root@zyj01 ~]# systemctl restart salt-master
- 创建/srv/salt目录
[root@zyj01 ~]# mkdir /srv/salt
- 创建top.sls文件,用于定义具体配置文件的路径
[root@zyj01 ~]# cd /srv/salt/
[root@zyj01 salt]# vim top.sls
内容如下:
base:
'*':
- file
- 创建top文件中定义的配置文件,用于定义具体的参数和文件(需要留空)
[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
- 创建测试文件1.txt
[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
十、配置管理目录
- 用saltstack把目录分发到客户机上执行
步骤
- 创建top.sls配置文件
[root@zyj01 ~]# cd /srv/salt/
[root@zyj01 salt]# vim top.sls
内容如下:
base:
'*':
- dir
- 创建top文件中定义的具体的规则文件dir.sls
[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
- 在zyj02上查看
[root@zyj02 ~]# ll -ad /tmp/testdir/
drwxr-x--- 2 root root 6 9月 9 11:25 /tmp/testdir/
- 在123目录下在创建一个空目录和文件
[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
- 到zyj02上查看
[root@zyj02 ~]# ls /tmp/testdir/
11.txt
saltstack只分发了文件,空目录不会被分发
- 在11目录上创建文件再分发
[root@zyj01 salt]# touch test/123/11/1.txt
[root@zyj01 salt]# salt 'zyj02' state.highstate
- 再到zyj02上查看
[root@zyj02 ~]# ls /tmp/testdir/ ##有11目录
11 11.txt
目录为非空目录时会被分发
十一、配置管理远程命令
- 用saltstack把shell脚本分发到客户机上执行
步骤
- 创建top.sls配置文件
[root@zyj01 salt]# vim top.sls
内容如下:
base:
'*':
- shell
- 创建top配置文件定义的规则文件shell.sls
[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
- 在zyj02上查看,脚本执行成功
[root@zyj02 ~]# ls /tmp/
1122
1122.txt
十二、 配置管理计划任务
用saltstack把计划任务分发到客户机上执行
步骤
- 创建top.sls主配置文件
[root@zyj01 salt]# vim top.sls
内容如下:
base:
'*':
- cron
- 创建top配置文件定义的规则文件cron.sls
[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都是以配置文件的形式存在的。
- 分发任务计划到zyj02
[root@zyj01 salt]# salt 'zyj02' state.highstate
- 在zyj02上查看crontab
[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
- 在zyj02上,查看crontab
[root@zyj02 ~]# crontab -l
# Lines below here are managed by Salt, do not edit
十三、其他命令
- 显示存活的minion
格式:salt-run manage.up
[root@zyj01 salt]# salt-run manage.up
- zyj01
- zyj02
- 拷贝master上的文件到客户端
格式: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:
十四、salt-ssh使用
- salt-ssh不需要对客户端做认证,客户端也不用安装salt-minion
步骤
- 安装saltstack yum源和salt-ssh包
[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执行命令
格式: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
- 通过salt-ssh直接使用命令
[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