自动化运维——saltstack

一、自动化运维介绍

  • 传统运维缺点

    • 传统运维效率低,大多工作人为完成
    • 传统运维工作繁琐,容易出错
    • 传统运维每日重复做相同的事情
    • 传统运维没有标准化流程
    • 传统运维的脚本繁多,不能方便管理
    • 自动化运维就是要解决上面所有问题
  • Puppetwww.puppetlabs.com)基于rubby开发,c/s架构,支持多平台,可管理配置文件、用户、cron任务、软件包、系统服务等。 分为社区版(免费)和企业版(收费),企业版支持图形化配置。

  • Saltstack(官网 https://saltstack.com,文档docs.saltstack.com )基于python开发,c/s架构,支持多平台,比puppet轻量,在远程执行命令时非常快捷,配置和使用比puppet容易,能实现puppet几乎所有的功能。

  • Ansiblewww.ansible.com )更加简洁的自动化运维工具,不需要在客户端上安装agent,基于python开发。可以实现批量操作系统配置、批量程序的部署、批量运行命令。

二、saltstack安装

  1. 192.168.157.128 zyj01 既做服务端 也做客户端
  2. 192.168.157.130 zyj02 做客户端

  1. 为两台机器设置hostname
[root@zyj01 ~]# hostnamectl set-hostname zyj01
[root@zyj02 ~]# hostnamectl set-hostname zyj02
  1. 分别在俩台机器上设置hosts
vim /etc/hosts
增加以下内容:
192.168.157.128 zyj01
192.186.157.130 zyj02
  1. 分别为两台机器安装saltstack yum源(可以在官方文档中找到最新的版本)
[root@zyj01 ~]# yum install -y http://repo.saltstack.com/yum/redhat/salt-repo-latest-2.el7.noarch.rpm
  1. 在128(zyj01)上安装salt-master(服务端)和salt-minion
yum install -y salt-master salt-minion
  1. 在130(zyj02)上安装salt-minion
yum install -y salt-minion

三、启动salt相关服务


  1. 在zyj01上编辑minion配置文件/etc/salt/minion
 [root@zyj01 ~]# vim /etc/salt/minion
在配置文件中取消注释,并修改内容如下:
master: zyj01
  1. 在zyj上启动master和minion
[root@zyj01 ~]# systemctl start salt-minion
[root@zyj01 ~]# systemctl start salt-master
  1. 在zyj02上编辑minion配置文件启动服务
[root@zyj02 ~]# vim /etc/salt/minion
在配置文件中取消注释,并修改内容如下:
master: zyj01
  1. 在zyj02上启动minion服务
[root@zyj02 ~]# systemctl start salt-minion
  1. 查看相关服务监听的端口
[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认证工具
  1. -a 后面跟主机名,认证指定主机
  2. -A 认证所有主机
  3. -r 跟主机名,拒绝指定主机
  4. -R 拒绝所有主机
  5. -d 跟主机名,删除指定主机认证
  6. -D 删除全部主机认证
  7. -y 省略掉交互,相当于直接按了y
  • 直接使用 命令salt-key可以查看所有minion的认证状态
[root@zyj01 ~]# salt-key
Accepted Keys:
Denied Keys:
Unaccepted Keys:
zyj01
zyj02
Rejected Keys:
  • 认证主机zyj01,可以在主机名后面添加选项-y省略交互
  1. 格式: 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
  1. 格式: 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
  1. 格式: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.
  • 认证所有主机
  1. 格式: 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远程执行命令

  • 测试客户端网络
  1. 格式:salt '主机名' testping
 [root@zyj01 ~]# salt '*' test.ping
zyj02:
True
zyj01:
True
  • 让客户端运行命令
  1. 格式: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匹配主机
  1. 格式:salt -I '键:值'
 [root@zyj01 pillar]# salt -I 'conf:/etc/123.conf' test.ping
zyj01:
True

六、grains

grains是在minion启动时收集到的一些信息,比如操作系统类型、网卡ip、内核版本、cpu架构等。
grains的信息并不是动态的,并不会实时变更,它是在minion启动时收集到的。

  • 列出所有的grains项目名字
  1. 格式:salt '主机名' grains.ls
 [root@zyj01 ~]# salt '*' grains.ls
zyj02:
- SSDs
- biosreleasedate
- biosversion
  • 列出所有grains项目以及值
  1. 格式:salt '主机名' grains.items
 [root@zyj01 ~]# salt '*' grains.items
zyj02:
----------
SSDs:
biosreleasedate:
07/31/2013
biosversion:
6.00
  • grains支持自定义信息,等于给主机打标签

步骤

  1. 在zyj02上添加自定义grains信息
 [root@zyj02 ~]# vim /etc/salt/grains
添加以下内容:
role: web       ##一个key对应一个value     
env: test
  1. 重启minion服务
[root@zyj02 ~]# systemctl restart salt-minion
  1. 在zyj01上根据grains信息执行命令
 [root@zyj01 ~]# salt '*' grains.item role env ##列出所有grains是role env的值
zyj02:
----------
env:
test
role:
web
zyj01:
----------
env:
role:
  1. grainsroleweb的主机运行命令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

    • 步骤
  1. 配置master配置文件
[root@zyj01 ~]# vim /etc/salt/master
去掉下面参数的注释#

pillar_roots:
  base: ##空两格
    - /srv/pillar ##空四格
  1. 创建/srv/pillar目录,/srv/pillar目录用于存放pillar文件
[root@zyj01 ~]# mkdir /srv/pillar
  1. 创建子和主配置文件
[root@zyj01 ~]# cd /srv/pillar/  #移动至/srv/pillar/
[root@zyj01 pillar]# vim top.sls  #创建并编辑top.sls文件,salt都会先通过该配置文件去调用pillar的相关定义文件。
增加内容如下:
base:
  'zyj01': ##空两格,定义主机
    - test ##空四格,定义调用的文件名称
  'zyj02':  ##空两格,定义主机
    - test2  ##空四格,定义调用的文件名称
  1. 创建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安装
    步骤
  1. 配置master配置文件
[root@zyj01 ~]# vim /etc/salt/master
把下面参数#去掉,依然要留空格1、2、4
file_roots:
  base:
    - /srv/salt/
  1. 重启salt-master服务
 [root@zyj01 ~]# systemctl restart salt-master
  1. 创建/srv/salt目录
 [root@zyj01 ~]# mkdir /srv/salt
  1. 创建主配置文件
[root@zyj01 ~]# cd /srv/salt/
[root@zyj01 salt]# vim top.sls
base:
  '*':
    - httpd
  1. 创建具体的安装配置文件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表示开机启动。

  1. 执行安装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
  1. 查看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存放模板文件再分发到其他客户机上
    步骤
  1. 配置master的salt的主配置文件
[root@zyj01 ~]# vim /etc/salt/master
把下面参数#去掉

file_roots:
  base:
    - /srv/salt/
  1. 重启salt-master服务
 [root@zyj01 ~]# systemctl restart salt-master
  1. 创建/srv/salt目录
[root@zyj01 ~]# mkdir /srv/salt
  1. 创建top.sls文件,用于定义具体配置文件的路径
 [root@zyj01 ~]# cd /srv/salt/
[root@zyj01 salt]# vim top.sls
内容如下:
base:
  '*':
    - file
  1. 创建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. 创建测试文件1.txt
 [root@zyj01 salt]# mkdir test
[root@zyj01 salt]# echo "111" > test/1.txt
  1. 传输文件
 [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把目录分发到客户机上执行

步骤

  1. 创建top.sls配置文件
[root@zyj01 ~]# cd /srv/salt/
[root@zyj01 salt]# vim top.sls
内容如下:
base:
  '*':
    - dir
  1. 创建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加上它之后,源删除文件或目录,目标也会跟着删除,否则不会删除

  1. 创建对应目录
[root@zyj01 salt]# mkdir test/123
  1. 分发目录
[root@zyj01 salt]# salt 'zyj02' state.highstate
zyj02:
----------
ID: file_dir
Function: file.recurse
Name: /tmp/testdir
  1. 在zyj02上查看
 [root@zyj02 ~]# ll -ad /tmp/testdir/
drwxr-x--- 2 root root 6 9月 9 11:25 /tmp/testdir/
  1. 在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
  1. 到zyj02上查看
 [root@zyj02 ~]# ls /tmp/testdir/ 
11.txt

saltstack只分发了文件,空目录不会被分发

  1. 在11目录上创建文件再分发
 [root@zyj01 salt]# touch test/123/11/1.txt
[root@zyj01 salt]# salt 'zyj02' state.highstate
  1. 再到zyj02上查看
 [root@zyj02 ~]# ls /tmp/testdir/ ##有11目录
11 11.txt

目录为非空目录时会被分发

十一、配置管理远程命令

  • 用saltstack把shell脚本分发到客户机上执行

步骤

  1. 创建top.sls配置文件
 [root@zyj01 salt]# vim top.sls
内容如下:
base:
  '*':
    - shell
  1. 创建top配置文件定义的规则文件shell.sls
[root@zyj01 salt]# vim shell.sls
内容如下:
shell_test:
cmd.script:
- source: salt://test/1.sh
- user: root
  1. 创建对应的脚本
 [root@zyj01 salt]# vim test/1.sh
内容如下:
#!/bin/bash
touch /tmp/1122.txt
if [ ! -d /tmp/1122 ]
then
mkdir /tmp/1122
fi
  1. 分发脚本
 [root@zyj01 salt]# salt 'zyj02' state.highstate
  1. 在zyj02上查看,脚本执行成功
 [root@zyj02 ~]# ls /tmp/
1122
1122.txt

十二、 配置管理计划任务

用saltstack把计划任务分发到客户机上执行

步骤

  1. 创建top.sls主配置文件
 [root@zyj01 salt]# vim top.sls
内容如下:
base:
  '*':
   - cron
  1. 创建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都是以配置文件的形式存在的。

  1. 分发任务计划到zyj02
 [root@zyj01 salt]# salt 'zyj02' state.highstate
  1. 在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来管理这个任务计划

  1. 删除任务计划,需要修改规则文件
 [root@zyj01 salt]# vim cron.sls
内容如下
cron_test:
  cron.absent:
    - name: /bin/bash /tmp/111.txt
  1. 执行命令删除任务计划
[root@zyj01 salt]# salt 'zyj02' state.highstate
  1. 在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

步骤

  1. 安装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
  1. 修改配置文件
[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
  1. 使用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
  1. 通过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

猜你喜欢

转载自blog.csdn.net/CN_SHzhaoyujie/article/details/84593423