SaltStack配置管理与数据系统

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地址部署功能性能
master192.168.143.101salt-master salt-minion4核8G
node1192.168.143.102salt-minion1核2G
node2192.168.143.103salt-minion1核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

1102 04:53:10 node2 mysql-prepare-db-dir[3676]: See the MariaD>
1102 04:53:10 node2 mysql-prepare-db-dir[3676]: MySQL manual f>
1102 04:53:10 node2 mysql-prepare-db-dir[3676]: Please report >
1102 04:53:10 node2 mysql-prepare-db-dir[3676]: The latest inf>
1102 04:53:10 node2 mysql-prepare-db-dir[3676]: You can find a>
1102 04:53:10 node2 mysql-prepare-db-dir[3676]: http://dev.mys>
1102 04:53:10 node2 mysql-prepare-db-dir[3676]: Consider joini>
1102 04:53:10 node2 mysql-prepare-db-dir[3676]: https://mariad>
1102 04:53:10 node2 mysqld[6293]: 2021-11-02  4:53:10 0 [Note]>
1102 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

1102 05:17:01 node1 systemd[1]: Starting The nginx HTTP and re>
1102 05:17:01 node1 nginx[6687]: nginx: the configuration file>
1102 05:17:01 node1 nginx[6687]: nginx: configuration file /et>
1102 05:17:01 node1 systemd[1]: nginx.service: Failed to parse>
1102 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

1102 05:07:13 node2 systemd[1]: Starting The Apache HTTP Serve>
1102 05:07:24 node2 httpd[6735]: AH00558: httpd: Could not rel>
1102 05:07:24 node2 systemd[1]: Started The Apache HTTP Server.
1102 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

1102 05:29:01 node2 systemd[1]: Starting The Apache HTTP Serve>
1102 05:29:11 node2 httpd[8823]: AH00558: httpd: Could not rel>
1102 05:29:11 node2 systemd[1]: Started The Apache HTTP Server.
1102 05:29:21 node2 httpd[8823]: Server configured, listening >
//由此可见高级状态并没有执行,因为httpd并没有启动

4.SaltStack数据系统

SaltStack有两大数据系统,分别是:

  • Grains

  • Pillar

    Grains与Pillar的区别

    存储位置类型采集方式应用场景
    Grainsminion静态minion启动时采集可通过刷新避免重启minion服务1.信息查询 2.在命令行下进行目标匹配 3.在top file中进行目标匹配 4.在模板中进行目标匹配
    Pillarmaster动态指定,实时生效1.目标匹配2.敏感数据配置

5.SaltStack数据系统组件

5.1 SaltStack组件之Grains

GrainsSaltStack的一个组件,其存放着minion启动时收集到的信息。

GrainsSaltStack组件中非常重要的组件之一,因为我们在做配置部署的过程中会经常使用它,GrainsSaltStack记录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
...省略
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值