1.SaltStack之配置管理
1. 1YAML语言
YAML
是一种直观的能够被电脑识别的数据序列化格式,是一个可读性高并且容易被人类阅读,容易和脚本语言交互,用来表达资料序列的编程语言。
它类似于标准通用标记语言的子集XML的数据描述语言,语法比XML简单很多。
YAML
语言的格式如下:
house:
family:
name: Doe
parents:
- John
- Jane
children:
- Paul
- Mark
- Simone
address:
number: 34
street: Main Street
city: Nowheretown
zipcode: 12345
YAML的基本规则:
- 使用缩进来表示层级关系,每层2个空格,禁止使用TAB键
- 当冒号不是处于最后时,冒号后面必须有一个空格
- 用 - 表示列表,- 的后面必须有一个空格
- 用 # 表示注释
YAML
配置文件要放到SaltStack
让我们放的位置,可以在SaltStack
的 Master 配置文件中查找file_roots
即可看到。
实例:
[root@master ~]# vim /etc/salt/master
...
file_roots:
base:
- /srv/salt/base
dev:
- /srv/salt/dev
prod:
- /srv/salt/prod
test:
- /srv/salt/test
...
[root@master salt]# mkdir -p /srv/salt/{base,test,dev,prod}
[root@master salt]# tree /srv
/srv
└── salt
├── base
├── dev
├── prod
└── test
5 directories, 0 files
[root@master salt]# systemctl restart salt-master.service
需要注意:
- base是默认的位置,如果file_roots只有一个,则base是必备的且必须叫base,不能改名
2. 用SaltStack配置一个apache实例
2.1 在Master上部署sls配置文件并执行
环境说明:
centos8
主机名 | IP地址 | 部署功能 | 性能 |
---|---|---|---|
master | 192.168.143.101 | salt-master salt-minion | 4核8G |
node1 | 192.168.143.102 | salt-minion | 1核2G |
node2 | 192.168.143.103 | salt-minion | 1核2G |
[root@master ~]# cd /srv/salt/base/
[root@master base]# ls
[root@master base]# mkdir -p web/apache
[root@master base]# vim web/apache/apache.sls
apache-install:
pkg.installed:
- name: httpd
apache-service:
service.running:
- name: httpd
- enable: True
// YAML 配置文件中顶格写的被称作ID,必须全局唯一,不能重复
// SaltStack 读 YAML 配置文件时是从上往下读,所以要把先执行的写在前面
[root@master base]# salt 'node1' state.sls web.apache.apache saltenv=base
//saltenv=base基础环境可以不加
#查看node1
[root@node1 ~]# rpm -qa|grep httpd
centos-logos-httpd-85.8-1.el8.noarch
httpd-filesystem-2.4.37-39.module_el8.4.0+950+0577e6ac.1.noarch
httpd-2.4.37-39.module_el8.4.0+950+0577e6ac.1.x86_64
httpd-tools-2.4.37-39.module_el8.4.0+950+0577e6ac.1.x86_64
//修改sls文件名执行不影响
[root@master base]# mv web/apache/apache.sls web/apache/install.sls
[root@master base]# salt 'node1' state.sls web.apache.install
#测试环境执行
[root@master base]# cp -r web ../test
[root@master base]# tree ..
..
├── base
│ └── web
│ └── apache
│ └── install.sls
├── dev
├── prod
└── test
└── web
└── apache
└── install.sls
8 directories, 2 files
[root@master base]# salt 'node1' state.sls web.apache.install saltenv=test
//绿色状态node1未改变
2.2 在Minion上检查
[root@node1 ~]# systemctl status httpd
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled;>
Active: active (running) since Tue 2021-11-02 04:13:25 EDT; 14m>
Docs: man:httpd.service(8)
Main PID: 2598 (httpd)
Status: "Running, listening on: port 80"
Tasks: 213 (limit: 11208)
Memory: 24.8M
CGroup: /system.slice/httpd.service
├─2598 /usr/sbin/httpd -DFOREGROUND
├─3015 /usr/sbin/httpd -DFOREGROUND
├─3016 /usr/sbin/httpd -DFOREGROUND
├─3017 /usr/sbin/httpd -DFOREGROUND
└─3018 /usr/sbin/httpd -DFOREGROUND
11月 02 04:13:15 node1 systemd[1]: Starting The Apache HTTP Server>
11月 02 04:13:25 node1 httpd[2598]: AH00558: httpd: Could not reli>
11月 02 04:13:25 node1 systemd[1]: Started The Apache HTTP Server.
11月 02 04:13:35 node1 httpd[2598]: Server configured, listening o>
lines 1-19/19 (END)
3. top file
3.1 top file介绍
直接通过命令执行sls文件时够自动化吗?答案是否定的,因为我们还要告诉某台主机要执行某个任务,自动化应该是我们让它干活时,它自己就知道哪台主机要干什么活,但是直接通过命令执行sls文件并不能达到这个目的,为了解决这个问题,top file 应运而生。
top file就是一个入口,top file的文件名可通过在 Master的配置文件中搜索top.sls找出,且此文件必须在 base 环境中,默认情况下此文件必须叫top.sls。
top file的作用就是告诉对应的主机要干什么活,比如让web服务器启动web服务,让数据库服务器安装mysql等等。
实例:
[root@master base]# mkdir -p database/mariadb
[root@master base]# mkdir -p database/mysql
[root@master base]# vim database/mariadb/install.sls
mysql-install:
pkg.installed:
- name: mariadb-server
mysql-service:
service.running:
- name: mariadb
- enable: True
[root@master base]# tree
.
├── database
│ ├── mariadb
│ │ └── install.sls
│ └── mysql
└── web
└── apache
└── install.sls
[root@master base]# salt 'node2' state.sls database.mariadb.install
//node2主机的状态
[root@node2 ~]# systemctl status mysql.service
● mariadb.service - MariaDB 10.3 database server
Loaded: loaded (/usr/lib/systemd/system/mariadb.service; enabl>
Active: active (running) since Tue 2021-11-02 04:53:11 EDT; 27>
Docs: man:mysqld(8)
https://mariadb.com/kb/en/library/systemd/
Main PID: 6293 (mysqld)
Status: "Taking your SQL requests now..."
Tasks: 30 (limit: 11208)
Memory: 84.8M
CGroup: /system.slice/mariadb.service
└─6293 /usr/libexec/mysqld --basedir=/usr
11月 02 04:53:10 node2 mysql-prepare-db-dir[3676]: See the MariaD>
11月 02 04:53:10 node2 mysql-prepare-db-dir[3676]: MySQL manual f>
11月 02 04:53:10 node2 mysql-prepare-db-dir[3676]: Please report >
11月 02 04:53:10 node2 mysql-prepare-db-dir[3676]: The latest inf>
11月 02 04:53:10 node2 mysql-prepare-db-dir[3676]: You can find a>
11月 02 04:53:10 node2 mysql-prepare-db-dir[3676]: http://dev.mys>
11月 02 04:53:10 node2 mysql-prepare-db-dir[3676]: Consider joini>
11月 02 04:53:10 node2 mysql-prepare-db-dir[3676]: https://mariad>
11月 02 04:53:10 node2 mysqld[6293]: 2021-11-02 4:53:10 0 [Note]>
11月 02 04:53:11 node2 systemd[1]: Started MariaDB 10.3 database >
lines 1-22/22 (END)
//top file实例
[root@master base]# mkdir web/nginx
[root@master base]# vim web/nginx/install.sls
[root@master base]# cat web/nginx/install.sls
nginx-install:
pkg.installed:
- name: nginx
nginx-service:
service.running:
- name: nginx
- enable: True
[root@master base]# tree
.
├── database
│ ├── mariadb
│ │ └── install.sls
│ └── mysql
└── web
├── apache
│ └── install.sls
└── nginx
└── install.sls
6 directories, 3 files
[root@master base]# vim top.sls
base:
node1:
- web.nginx.install
node2:
- web.apache.install
[root@master base]# salt '*' state.highstate
//查看node1和node2主机的状态
[root@node1 ~]# systemctl status nginx.service
● nginx.service - The nginx HTTP and reverse proxy server
Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled>
Active: active (running) since Tue 2021-11-02 05:17:01 EDT; 3m>
Process: 6689 ExecStart=/usr/sbin/nginx (code=exited, status=0/>
Process: 6687 ExecStartPre=/usr/sbin/nginx -t (code=exited, sta>
Process: 6686 ExecStartPre=/usr/bin/rm -f /run/nginx.pid (code=>
Main PID: 6691 (nginx)
Tasks: 2 (limit: 11208)
Memory: 3.6M
CGroup: /system.slice/nginx.service
├─6691 nginx: master process /usr/sbin/nginx
└─6692 nginx: worker process
11月 02 05:17:01 node1 systemd[1]: Starting The nginx HTTP and re>
11月 02 05:17:01 node1 nginx[6687]: nginx: the configuration file>
11月 02 05:17:01 node1 nginx[6687]: nginx: configuration file /et>
11月 02 05:17:01 node1 systemd[1]: nginx.service: Failed to parse>
11月 02 05:17:01 node1 systemd[1]: Started The nginx HTTP and rev>
lines 1-18/18 (END)
[root@node2 ~]# systemctl status httpd.service
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled>
Active: active (running) since Tue 2021-11-02 05:07:24 EDT; 12>
Docs: man:httpd.service(8)
Main PID: 6735 (httpd)
Status: "Running, listening on: port 80"
Tasks: 213 (limit: 11208)
Memory: 25.0M
CGroup: /system.slice/httpd.service
├─6735 /usr/sbin/httpd -DFOREGROUND
├─7159 /usr/sbin/httpd -DFOREGROUND
├─7160 /usr/sbin/httpd -DFOREGROUND
├─7161 /usr/sbin/httpd -DFOREGROUND
└─7162 /usr/sbin/httpd -DFOREGROUND
11月 02 05:07:13 node2 systemd[1]: Starting The Apache HTTP Serve>
11月 02 05:07:24 node2 httpd[6735]: AH00558: httpd: Could not rel>
11月 02 05:07:24 node2 systemd[1]: Started The Apache HTTP Server.
11月 02 05:07:34 node2 httpd[6735]: Server configured, listening >
lines 1-19/19 (END)
3.2 高级状态highstate的使用
管理SaltStack
时一般最常用的管理操作就是执行高级状态
[root@master ~]# salt '*' state.highstate //生产环境禁止这样使用salt命令
注意:
上面让所有人执行高级状态,但实际工作当中,一般不会这么用,工作当中一般都是通知某台或某些台目标主机来执行高级状态,具体是否执行则是由top file来决定的。
若在执行高级状态时加上参数test=True
,则它会告诉我们它将会做什么,但是它不会真的去执行这个操作。
实例:
[root@node2 ~]# yum remove httpd
//在master上执行高级状态的测试
[root@master base]# salt 'node*' state.highstate test=true
//在node2状态
[root@node2 ~]# ss -atnl
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 80 *:3306 *:*
LISTEN 0 128 [::]:22 [::]:*
//非测试状态
[root@master base]# salt 'node*' state.highstate
[root@node2 ~]# systemctl status httpd.service
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled>
Active: active (running) since Tue 2021-11-02 05:29:11 EDT; 50>
Docs: man:httpd.service(8)
Main PID: 8823 (httpd)
Status: "Running, listening on: port 80"
Tasks: 213 (limit: 11208)
Memory: 24.3M
CGroup: /system.slice/httpd.service
├─8823 /usr/sbin/httpd -DFOREGROUND
├─9294 /usr/sbin/httpd -DFOREGROUND
├─9295 /usr/sbin/httpd -DFOREGROUND
├─9296 /usr/sbin/httpd -DFOREGROUND
└─9297 /usr/sbin/httpd -DFOREGROUND
11月 02 05:29:01 node2 systemd[1]: Starting The Apache HTTP Serve>
11月 02 05:29:11 node2 httpd[8823]: AH00558: httpd: Could not rel>
11月 02 05:29:11 node2 systemd[1]: Started The Apache HTTP Server.
11月 02 05:29:21 node2 httpd[8823]: Server configured, listening >
//由此可见高级状态并没有执行,因为httpd并没有启动
4.SaltStack数据系统
SaltStack有两大数据系统,分别是:
-
Grains
-
Pillar
Grains与Pillar的区别
存储位置 类型 采集方式 应用场景 Grains minion 静态 minion启动时采集可通过刷新避免重启minion服务 1.信息查询 2.在命令行下进行目标匹配 3.在top file中进行目标匹配 4.在模板中进行目标匹配 Pillar master 动态 指定,实时生效 1.目标匹配2.敏感数据配置
5.SaltStack数据系统组件
5.1 SaltStack组件之Grains
Grains
是SaltStack
的一个组件,其存放着minion启动时收集到的信息。
Grains
是SaltStack
组件中非常重要的组件之一,因为我们在做配置部署的过程中会经常使用它,Grains
是SaltStack
记录minion
的一些静态信息的组件。可简单理解为Grains
记录着每台minion
的一些常用属性,比如CPU、内存、磁盘、网络信息等。我们可以通过grains.items
查看某台minion
的所有Grains
信息。
Grains的功能:
- 收集资产信息
Grains应用场景:
- 信息查询
- 在命令行下进行目标匹配
- 在top file中进行目标匹配
- 在模板中进行目标匹配
模板中进行目标匹配请看:https://docs.saltstack.com/en/latest/topics/pillar/
实例:
//列出所有grains的key和value
[root@master base]# salt 'node1' grains.items
node1:
----------
biosreleasedate:
07/22/2020
biosversion:
6.00
cpu_flags:
。。。。由于太多了省略
//匹配系统执行命令
[root@master base]# salt -G 'os:centos' cmd.run 'date'
node2:
Tue Nov 2 05:40:14 EDT 2021
node1:
Tue Nov 2 05:40:14 EDT 2021
master:
Tue Nov 2 05:40:14 EDT 2021
//过滤事实,键用.表示,值用:表示
[root@master base]# salt 'node2' grains.get fqdn_ip4
node2:
- 192.168.143.103
[root@master base]# salt 'node2' grains.get fqdn_ip4
node2:
- 192.168.143.103
[root@master base]# salt 'node2' grains.get ip4_interfaces
node2:
----------
ens33:
- 192.168.143.103
lo:
- 127.0.0.1
[root@master base]# salt 'node2' grains.get ip4_interfaces:ens33
node2:
- 192.168.143.103
//匹配系统,执行
参考:
[root@master ~]# vim /srv/salt/base/top.sls
base:
'os:centos':
- match: grain
- web.apache.install
[root@master base]# salt -G 'os:centos' state.highstate //只有centos会执行
//自定义Grains
[root@node1 ~]# vim /etc/salt/grains
banji: yun1902
banji2: linux运维1班
[root@master base]# salt '*' saltutil.sync_grains
[root@master base]# salt 'node1' grains.items
node1:
----------
banji:
yun1902
banji2:
linux运维1班
5.2 SaltStack组件之Pillar
Pillar也是SaltStack组件中非常重要的组件之一,是数据管理中心,经常配置states在大规模的配置管理工作中使用它。Pillar在SaltStack中主要的作用就是存储和定义配置管理中需要的一些数据,比如软件版本号、用户名密码等信息,它的定义存储格式与Grains类似,都是YAML格式。
在Master配置文件中有一段Pillar settings选项专门定义Pillar相关的一些参数:
#pillar_roots:
# base:
# - /srv/pillar
默认Base环境下Pillar的工作目录在/srv/pillar目录下。若你想定义多个环境不同的Pillar工作目录,只需要修改此处配置文件即可。
Pillar的特点:
- 可以给指定的minion定义它需要的数据
- 只有指定的人才能看到定义的数据
- 在master配置文件里设置
实例:
#默认pillar
[root@master ~]# vim /etc/salt/master
...
pillar_roots:
base: //此三行取消#注释
- /srv/pillar
...
[root@master base]# pwd
/srv/salt/base
[root@master base]# mkdir -p /srv/pillar
[root@master base]# systemctl restart salt-master.service
//默认是看不到的
[root@master base]# salt '*' pillar.items
master:
----------
node2:
----------
node1:
----------
需要开启服务
[root@master base]# vim /etc/salt/master
...
pillar_opts: True //修改此行为True
...
[root@master base]# systemctl restart salt-master.service
[root@master base]# salt 'node1' pillar.items
node1:
----------
master:
----------
__cli:
salt-master
__role:
master
allow_minion_key_revoke:
...由于太多了省略
#自定义pillar
[root@master base]# cd /etc/salt/p
pki/ proxy.d/
[root@master base]# cd /srv/pillar/
[root@master pillar]# ls
[root@master pillar]# vim apache.sls
[root@master pillar]# cat apache.sls
{% if grains['os'] == 'CentOS' %}
apache: httpd
{% elif grains['os'] == 'Debian' %}
apache: apache2
{% endif %}
[root@master pillar]# mkdir base
[root@master pillar]# ls
apache.sls base
[root@master pillar]# mv apache.sls base/
[root@master pillar]# vim /etc/salt/master
...
pillar_roots:
base:
- /srv/pillar/base //修改对应的位置
...
[root@master pillar]# systemctl restart salt-master.service
[root@master pillar]# vim base/top.sls
base:
'node2':
- apache
[root@master pillar]# salt '*' pillar.items
master:
----------
node2:
----------
apache:
httpd
node1:
----------
//让centos,node1和node2都能看到
[root@master pillar]# vim base/top.sls
base:
'node*':
- apache
[root@master pillar]# salt '*' pillar.items
master:
----------
node1:
----------
apache:
httpd
node2:
----------
apache:
httpd
//在salt下修改apache的状态文件,引用pillar的数据
[root@master pillar]# vim /srv/salt/base/web/apache/install.sls
apache-install:
pkg.installed:
- name: {{ pillar['apache'] }}
apache-service:
service.running:
- name: {{ pillar['apache'] }}
- enable: True
//执行高级状态文件
[root@master pillar]# salt 'node*' state.highstate
node2:
----------
ID: apache-install
Function: pkg.installed
Name: httpd
Result: True
Comment: All specified packages are already installed
Started: 06:52:28.697223
Duration: 1106.858 ms
Changes:
----------
ID: apache-service
Function: service.running
Name: httpd
Result: True
Comment: The service httpd is already running
Started: 06:52:29.806386
Duration: 63.216 ms
Changes:
Summary for node2
------------
Succeeded: 2
Failed: 0
------------
Total states run: 2
Total run time: 1.170 s
node1:
----------
ID: nginx-install
Function: pkg.installed
Name: nginx
Result: True
...省略