自动化运维工具——saltstack(一)

1. SaltStack介绍

1.1 自动化运维工具

作为一个运维人员,很大一部分工作是在业务的配置管理和状态维护以及版本发布上,而当业务场景及公司规模上了一定规模后,人为手工的去做这些工作将变得极其困难,此时我们将需要利用一些自动化运维的工具来达到批量管理的目的。

常用的自动化运维工具有:

  • puppet
  • ansible
  • saltstack

此三款属同类工具,皆可用来提高运维管理的效率,但它们又各有优势,目前主流的自动化运维工具是ansible和saltstack。其中ansible无需安装客户端,这是其最大的优势,而saltstack则需要安装客户端工具,类似zabbix的agent。应用场景方面,ansible常用于小型企业,而saltstack则常用于中大型企业,因为ansible无法并行执行而saltstack可以并行。但不论其特点如何,本质上均属同类,所以只需要掌握一种即可轻松胜任运维工作。

1.2 saltstack的特点

  • 基于python开发的C/S架构配置管理工具
  • 底层使用ZeroMQ消息队列pub/sub方式通信
  • 使用SSL证书签发的方式进行认证管理,传输采用AES加密

1.3 saltstack服务架构

在saltstack架构中服务器端叫Master,客户端叫Minion。

在Master和Minion端都是以守护进程的模式运行,一直监听配置文件里面定义的ret_port(接受minion请求)和publish_port(发布消息)的端口。

当Minion运行时会自动连接到配置文件里面定义的Master地址ret_port端口进行连接认证。

saltstack除了传统的C/S架构外,其实还有一种叫做masterless的架构,其不需要单独安装一台 master 服务器,只需要在每台机器上安装 Minion端,然后采用本机只负责对本机的配置管理机制服务的模式。

2. SaltStack四大功能与四大运行方式

SaltStack有四大功能,分别是:

  • 远程执行
  • 配置管理/状态管理
  • 云管理(cloud)
  • 事件驱动

SaltStack可以通过远程执行实现批量管理,并且通过描述状态来达到实现某些功能的目的。

SaltStack四大运行方式:

  • local本地运行
  • Master/Minion传统方式
  • Syndic分布式
  • Salt ssh

3. SaltStack组件介绍

组件功能
Salt Master用于将命令和配置发送到在受管系统上运行的Salt minion
Salt Minions从Salt master接收命令和配置
Execution Modules从命令行针对一个或多个受管系统执行的临时命令。对…有用
1. 实时监控,状态和库存
2. 一次性命令和脚本
3. 部署关键更新
Formulas (States)系统配置的声明性或命令式表示
GrainsGrains是有关底层受管系统的静态信息,包括操作系统,内存和许多其他系统属性。
Pillar用户定义的变量。这些安全变量被定义并存储在Salt Master中,然后使用目标“分配”给一个或多个Minion。
Pillar数据存储诸如端口,文件路径,配置参数和密码之类的值。
Top File将Formulas (States)和Salt Pillar数据与Salt minions匹配。
Runners在Salt master上执行的模块,用于执行支持任务。Salt runners报告作业状态,连接状态,从外部API读取数据,查询连接的Salt minions等。
Returners将Salt minions返回的数据发送到另一个系统,例如数据库。Salt Returners可以在Salt minion或Salt master上运行。
Reactor在SaltStack环境中发生事件时触发反应。
Salt Cloud
/ Salt Virt
在云提供商/虚拟机管理程序上提供系统,并立即将其置于管理之下。
Salt SSH在没有Salt minion的系统上通过SSH运行Salt命令。

4. SaltStack安装与最小化配置

环境说明:

主机类型主机名IP要安装的应用
控制机zzl01192.168.20.99salt
salt-master
salt-minion
salt-ssh
salt-syndic
被控机zzl02192.168.20.120salt-minion

官方yum源地址:https://repo.saltstack.com

4.1 在控制机上安装saltstack主控端软件

//配置yum源
[root@master ~]# rpm -ivh https://repo.saltstack.com/yum/redhat/salt-repo-latest-2.el7.noarch.rpm

//安装saltstack主控端
[root@zzl01 ~]# yum -y install salt salt-master salt-minion salt-ssh  salt-syndic

//修改主控端的配置文件
[root@zzl01 ~]# vim /etc/salt/minion
master: 192.168.20.99    //控制机ip

//启动主控端的salt-master和salt-minion,并设置开机自启
[root@zzl01 ~]# systemctl enable --now salt-master salt-minion
Created symlink from /etc/systemd/system/multi-user.target.wants/salt-master.service to /usr/lib/systemd/system/salt-master.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/salt-minion.service to /usr/lib/systemd/system/salt-minion.service.
[root@zzl01 ~]# ss -antl
State       Recv-Q Send-Q Local Address:Port               Peer Address:Port              
LISTEN      0      128     *:22                  *:*                  
LISTEN      0      128     *:4505                *:*                  
LISTEN      0      128     *:4506                *:*                  
LISTEN      0      128    :::22                 :::*                  

4.2 在被控机上安装salt-minion客户端

//配置yum源
[root@minion ~]# rpm -ivh https://repo.saltstack.com/yum/redhat/salt-repo-latest-2.el7.noarch.rpm

[root@minion ~]# yum -y install salt-minion

[root@zzl01 ~]# vim /etc/salt/minion
master: 192.168.20.99    //控制机ip

[root@zzl02 ~]# systemctl enable --now salt-minion
Created symlink from /etc/systemd/system/multi-user.target.wants/salt-minion.service to /usr/lib/systemd/system/salt-minion.ser

4.3 saltstack配置文件

saltstack的配置文件在/etc/salt目录
saltstack配置文件说明:

配置文件说明
/etc/salt/master主控端(控制端)配置文件
/etc/salt/minion受控端配置文件

配置文件/etc/salt/master默认的配置就可以很好的工作,故无需修改此配置文件。

配置文件/etc/salt/minion常用配置参数

  • master:设置主控端的IP
  • id:设置受控端本机的唯一标识符,可以是ip也可以是主机名或自取某有意义的单词

在日常使用过程中,经常需要调整或修改Master配置文件,SaltStack大部分配置都已经指定了默认值,只需根据自己的实际需求进行修改即可。下面的几个参数是比较重要的

  • max_open_files:可根据Master将Minion数量进行适当的调整
  • timeout:可根据Master和Minion的网络状况适当调整
  • auto_accept和autosign_file:在大规模部署Minion时可设置自动签证
  • master_tops和所有以external开头的参数:这些参数是SaltStack与外部系统进行整合的相关配置参数

5. SaltStack认证机制

saltstack主控端是依靠openssl证书来与受控端主机认证通讯的,受控端启动后会发送给主控端一个公钥证书文件,在主控端用salt-key命令来管理证书。

salt-minion与salt-master的认证过程:

  • minion在第一次启动时,会在/etc/salt/pki/minion/下自动生成一对密钥,然后将公钥发给master
  • master收到minion的公钥后,通过salt-key命令接受该公钥。此时 master的/etc/salt/pki/master/minions目录将会存放以minion id命名的公钥,然后master就能对minion发送控制指令了
//salt-key常用选项
    -L             //列出所有公钥信息
    -a minion      //接受指定minion等待认证的key
    -A             //接受所有minion等待认证的key
    -r minion      //拒绝指定minion等待认证的key
    -R             //拒绝所有minion等待认证的key
    -f minion      //显示指定key的指纹信息
    -F             //显示所有key的指纹信息
    -d minion      //删除指定minion的key
    -D             //删除所有minion的key
    -y             //自动回答yes

//查看当前证书情况
[root@zzl01 ~]# salt-key -L
Accepted Keys:
Denied Keys:
Unaccepted Keys:
zzl01
zzl02
Rejected Keys:

//接受指定minion的新证书
[root@zzl01 ~]# salt-key -ya zzl01
The following keys are going to be accepted:
Unaccepted Keys:
zzl01
Key for minion zzl01 accepted.
[root@zzl01 ~]# salt-key -L
Accepted Keys:
zzl01
Denied Keys:
Unaccepted Keys:
zzl02
Rejected Keys:

//接受所有的minion的证书
[root@zzl01 ~]# salt-key -yA zzl01
The following keys are going to be accepted:
Unaccepted Keys:
zzl02
Key for minion zzl02 accepted.
[root@zzl01 ~]# salt-key -L
Accepted Keys:
zzl01
zzl02
Denied Keys:
Unaccepted Keys:
Rejected Keys:

6. SaltStack远程执行

[root@zzl01 ~]# salt 'zzl01' test.ping
zzl01:
    True
[root@zzl01 ~]# salt 'zzl01' cmd.run hostname 
zzl01:
    zzl01
[root@zzl01 ~]# salt '*' test.ping
zzl01:
    True
zzl02:
    True

7. salt命令使用

//语法:salt [options] '<target>' <function> [arguments]

//常用的options
    --version               //查看saltstack的版本号
    --versions-report       //查看saltstack以及依赖包的版本号
    -h                      //查看帮助信息
    -c CONFIG_DIR           //指定配置文件目录(默认为/etc/salt/)
    -t TIMEOUT              //指定超时时间(默认是5s)
    --async                 //异步执行
    -v                      //verbose模式,详细显示执行过程
    --username=USERNAME     //指定外部认证用户名
    --password=PASSWORD     //指定外部认证密码
    --log-file=LOG_FILE     //指定日志记录文件
    
//常用target参数
    -E              //正则匹配
    -L              //列表匹配 
    -S              //CIDR匹配网段
    -G              //grains匹配
    --grain-pcre    //grains加正则匹配
    -N              //组匹配
    -R              //范围匹配
    -C              //综合匹配(指定多个匹配)
    -I              //pillar值匹配

[root@zzl01 ~]# salt -E 'zzl*' test.ping
zzl02:
    True
zzl01:
    True
[root@zzl01 ~]# salt -S '192.168.20.0/24' test.ping
zzl02:
    True
zzl01:
    True

YAML语言

YAML的基本规则:

  • 使用缩进来表示层级关系,每层2个空格,禁止使用TAB键
  • 当冒号不是处于最后时,冒号后面必须有一个空格
  • 用 - 表示列表,- 的后面必须有一个空格
  • 用 # 表示注释

用SaltStack配置一个nginx实例

[root@zzl01 ~]# vim /etc/salt/master
file_roots:
  base:
    - /srv/salt/base

[root@zzl01 ~]# mkdir -p /srv/salt/base
[root@zzl01 ~]# cd /srv/salt/base/
[root@zzl01 base]# mkdir web
[root@zzl01 base]# cd web/
[root@zzl01 web]# mkdir nginx
[root@zzl01 web]# cd nginx/
[root@zzl01 nginx]# vim nginx.sls     //生成一个状态描述文件
nginx-install:
  pkg.installed:
    - name: nginx

nginx-service:
  service.running:
    - name: nginx
    - enable: True

// YAML 配置文件中顶格写的被称作ID,必须全局唯一,不能重复
// SaltStack 读 YAML 配置文件时是从上往下读,所以要把先执行的写在前面



//执行状态描述文件
[root@zzl01 nginx]# salt 'zzl02' state.sls web.nginx.nginx       #默认是base,所有不用跟saltenv=base
zzl02:
----------
          ID: nginx-install
    Function: pkg.installed
        Name: nginx
      Result: True
     Comment: All specified packages are already installed
     Started: 15:47:26.954249
    Duration: 1066.795 ms
     Changes:   
----------
          ID: nginx-service
    Function: service.running
        Name: nginx
      Result: True
     Comment: Service nginx has been enabled, and is running
     Started: 15:47:28.021950
    Duration: 523.621 ms
     Changes:   
              ----------
              nginx:
                  True

Summary for zzl02
------------
Succeeded: 2 (changed=1)
Failed:    0
------------
Total states run:     2
Total run time:   1.590 s

在zzl02(minion)上面验证一下

[root@zzl02 yum.repos.d]# systemctl status nginx
● nginx.service - The nginx HTTP and reverse proxy server
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
   Active: active (running) since 六 2020-08-15 15:47:28 CST; 46s ago
 Main PID: 22859 (nginx)
   CGroup: /system.slice/nginx.service
           ├─22859 nginx: master process /usr/sbin/nginx
           └─22860 nginx: worker process

815 15:47:28 zzl02 systemd[1]: Starting The nginx HTTP and re....
815 15:47:28 zzl02 nginx[22854]: nginx: the configuration fil...k
815 15:47:28 zzl02 nginx[22854]: nginx: configuration file /e...l
815 15:47:28 zzl02 systemd[1]: Failed to read PID from file /...t
815 15:47:28 zzl02 systemd[1]: Started The nginx HTTP and rev....
Hint: Some lines were ellipsized, use -l to show in full.

top file

top file介绍

直接通过命令执行sls文件时够自动化吗?答案是否定的,因为我们还要告诉某台主机要执行某个任务,自动化应该是我们让它干活时,它自己就知道哪台主机要干什么活,但是直接通过命令执行sls文件并不能达到这个目的,为了解决这个问题,top file 应运而生。

top file就是一个入口,top file的文件名可通过在 Master的配置文件中搜索top.sls找出,且此文件必须在 base 环境中,默认情况下此文件必须叫top.sls。

top file的作用就是告诉对应的主机要干什么活,比如让web服务器启动web服务,让数据库服务器安装mysql等等。

top file 实例:

[root@zzl01 yum.repos.d]# cd /srv/salt/base/
[root@zzl01 base]# tree
.
├── top.sls
└── web
    └── nginx
        └── install.sls

2 directories, 2 files
[root@zzl01 base]# cd ..
[root@zzl01 salt]# tree
.
├── base
│   ├── top.sls
│   └── web
│       └── nginx
│           └── install.sls
└── dev
    └── web
        └── nginx
            └── service.sls

6 directories, 3 files
[root@zzl01 salt]# cat base/web/nginx/install.sls 
nginx-install:
  pkg.installed:
    - name: nginx
[root@zzl01 salt]# cat dev/web/nginx/service.sls 
nginx-service:
  service.running:
    - name: nginx
    - enable: True
[root@zzl01 salt]# cat base/top.sls 
base:
  'zzl02':
    - web.nginx.install

dev:
  'zzl02':
    - web.nginx.service
[root@zzl01 salt]# salt 'zzl02' state.highstate
zzl02:
----------
          ID: nginx-install
    Function: pkg.installed
        Name: nginx
      Result: True
     Comment: The following packages were installed/updated: nginx
     Started: 21:12:41.534166
    Duration: 35748.574 ms
     Changes:   
              ----------
              nginx:
                  ----------
                  new:
                      1:1.16.1-1.el7
                  old:
              nginx-all-modules:
                  ----------
                  new:
                      1:1.16.1-1.el7
                  old:
              nginx-mod-http-image-filter:
                  ----------
                  new:
                      1:1.16.1-1.el7
                  old:
              nginx-mod-http-perl:
                  ----------
                  new:
                      1:1.16.1-1.el7
                  old:
              nginx-mod-http-xslt-filter:
                  ----------
                  new:
                      1:1.16.1-1.el7
                  old:
              nginx-mod-mail:
                  ----------
                  new:
                      1:1.16.1-1.el7
                  old:
              nginx-mod-stream:
                  ----------
                  new:
                      1:1.16.1-1.el7
                  old:
----------
          ID: nginx-service
    Function: service.running
        Name: nginx
      Result: True
     Comment: Service nginx has been enabled, and is running
     Started: 21:13:17.291256
    Duration: 427.599 ms
     Changes:   
              ----------
              nginx:
                  True

Summary for zzl02
------------
Succeeded: 2 (changed=2)
Failed:    0
------------
Total states run:     2
Total run time:  36.176 s 

在minion上面检查

[root@zzl02 ~]# systemctl status nginx
● nginx.service - The nginx HTTP and reverse proxy server
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
   Active: active (running) since 一 2020-08-17 21:13:17 CST; 1min 19s ago
 Main PID: 51392 (nginx)
   CGroup: /system.slice/nginx.service
           ├─51392 nginx: master process /usr/sbin/nginx
           └─51395 nginx: worker process

817 21:13:17 zzl02 systemd[1]: Starting The nginx HTTP and re....
817 21:13:17 zzl02 nginx[51380]: nginx: the configuration fil...k
817 21:13:17 zzl02 nginx[51380]: nginx: configuration file /e...l
817 21:13:17 zzl02 systemd[1]: Failed to read PID from file /...t
817 21:13:17 zzl02 systemd[1]: Started The nginx HTTP and rev....
Hint: Some lines were ellipsized, use -l to show in full.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
自动化运维工具——ansible是一款开源的IT自动化工具,广泛应用于软件部署、配置管理和任务协同等领域。它的最大特点是简单易用、功能强大且跨平台。 首先,ansible具有简单易用的特点。它使用简单的YAML语言作为配置文件,无需编写复杂的脚本。用户只需要简单地定义主机和操作即可完成任务的执行。这使得即便是非开发人员,也能轻松上手使用ansible进行自动化管理。 其次,ansible功能强大。它支持广泛的操作系统、云平台和网络设备,并提供了丰富的模块化功能。通过在任务中使用ansible的模块,我们可以实现系统配置、软件安装、文件传输等各种常见操作。此外,ansible不仅支持并发执行任务,还能够将任务分组执行,并提供了强大的变量和条件控制功能。 再次,ansible跨平台。无论是在Linux、Unix还是Windows系统上,ansible都能够良好地运行。此外,它还支持云平台,如AWS、Azure等,以及网络设备,如Cisco、Juniper等。这使得ansible成为一个非常灵活的自动化运维工具,能够满足各种不同环境和需求的自动化管理。 最后,ansible还具有良好的社区支持。ansible拥有庞大的用户社区和活跃的开发者社区,有大量的文档、示例和插件可供参考和使用。这使得我们在使用ansible时能够获得快速解答和支持,同时也能够从社区中学习到更多的技巧和经验。 总而言之,ansible是一款简单易用、功能强大且跨平台的自动化运维工具。它在软件部署、配置管理和任务协同等方面具有广泛的应用,并且得到了良好的社区支持。无论是企业还是个人,都可以通过ansible来提高工作效率和自动化管理水平。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值