saltStack自动化工具

saltstack · 浏览次数 : 15

小编点评

SaltStack 是一种用于基础设施自动化和配置管理的工具,它可以帮助您轻松地管理大量 IT 基础设施。SaltStack 的核心概念包括: 1. Master 和 Minion 2. State 3. Pillar 4. Grains 5. Modules 6. Runner 7. Reactor 工作流程: 1. 管理员在 Master 上发送命令。 2. Master 将命令分发给目标 Minion。 3. Minion 接收到命令后执行相应操作。 4. Minion 将执行结果返回给 Master。 5. Master 汇总并展示执行结果。 安装和配置: 1. 配置 hosts 解析(可选) 2. 配置 yum 源(使用国内的镜像源) 3. SaltStack 安装 4. 配置 SaltStack 5. 接受认证公钥 6. 测试 7. 定义主机组 Grains 变量模块 8. 查询支持的模块 9. 查询某个模块的具体使用方法 10. 被控节点安装软件 11. 查询某个模块具体有哪些函数 通过以上步骤,您可以使用 SaltStack 自动化地管理和配置您的 IT 基础设施。

正文

SaltStack自动化工具

SaltStack 是一种基础设施自动化和配置管理工具,广泛用于管理大型 IT 基础设施。它能够自动化配置、部署、管理和监控服务器及应用程序。

核心概念

1. Master 和 Minion

  • Master:SaltStack 的主服务器,负责管理和控制多个 Minion。Master 发送命令,收集数据并进行协调。
  • Minion:被管理的节点,接收 Master 的命令并执行。Minion 可以是物理服务器、虚拟机或容器。

2. State

  • State:描述系统应该处于的状态,通常用 YAML 格式编写。例如,安装某个软件包,配置某个服务。
  • State File:存储 state 的文件,通常以 .sls 结尾。

3. Pillar

  • Pillar:存储敏感数据和配置信息,例如密码、密钥。Pillar 数据是 Master 特定的,不会被 Minion 共享。

4. Grains

  • Grains:静态数据的集合,描述 Minion 的特性(如操作系统、IP 地址、内存等)。

5. Modules

  • Modules:功能单元,用于执行特定任务。SaltStack 提供了丰富的内置模块,如执行命令、管理软件包、用户等。

6. Runner

  • Runner:在 Master 上执行的任务,用于进行一些复杂的管理操作,如管理批量任务、监控等。

7. Reactor

  • Reactor:事件响应系统,根据触发的事件自动执行预定义的操作。

工作流程

  1. 命令发送:管理员在 Master 上发送命令。
  2. 命令分发:Master 将命令分发给目标 Minion。
  3. 命令执行:Minion 接收到命令后执行相应操作。
  4. 结果返回:Minion 将执行结果返回给 Master。
  5. 结果汇总:Master 汇总并展示执行结果。

安装和配置

主机名 系统 IP
node1 控制节点 openEuler22.03 192.168.200.179
node2 被控节点 openEuler22.03 192.168.200.180
node3 被控节点 openEuler22.03 192.168.200.172

官网提供2种安装方式 saltStack官网

  • bootstrap:自动化安装
    • 通过官网的脚本可以执行并安装
  • manual:手动安装
    • 配置yum源手动安装并配置我们采取这种方式

1. 配置hosts解析

这一步可选,如果被管理节点过多的话可以不用做,因为做了反而浪费时间

[root@node01 ~]# cat /etc/hosts
127.0.0.1 localhost
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.200.179 node1
192.168.200.180 node2
192.168.200.172 node3

2. 配置yum源

官网有提供yum源,我们使用的是openEuler,选择RHEL的配置就行

地址

sudo rpm --import https://repo.saltproject.io/salt/py3/redhat/8/x86_64/SALT-PROJECT-GPG-PUBKEY-2023.pub
curl -fsSL https://repo.saltproject.io/salt/py3/redhat/8/x86_64/latest.repo | sudo tee /etc/yum.repos.d/salt.repo

直接执行官网的这2行命令就可以了,但是由于他配置的是国外的地址,我们下载软件包就会有点慢,我们可以将地址改为国内清华大学的

[root@node3 ~]# cat /etc/yum.repos.d/salt.repo 
[salt-repo]
name=Salt repo for RHEL/CentOS 8 PY3
baseurl=https://repo.saltproject.io/salt/py3/redhat/8/x86_64/latest
skip_if_unavailable=True
priority=10
enabled=1
enabled_metadata=1
gpgcheck=1
gpgkey=https://repo.saltproject.io/salt/py3/redhat/8/x86_64/latest/SALT-PROJECT-GPG-PUBKEY-2023.pub

这个是执行完命令之后帮我们生成的yum源,我们将地址替换掉

[root@node01 ~]# cat /etc/yum.repos.d/salt.repo 
[salt-repo]
name=Salt repo for RHEL/CentOS 8 PY3
baseurl=https://mirrors.tuna.tsinghua.edu.cn/saltstack/salt/py3/redhat/8/x86_64/latest/
skip_if_unavailable=True
priority=10
enabled=1
enabled_metadata=1
gpgcheck=1
gpgkey=https://mirrors.tuna.tsinghua.edu.cn/saltstack/salt/py3/redhat/8/x86_64/latest/SALT-PROJECT-GPG-PUBKEY-2023.pub

然后将yum源的repo文件发送到各个节点

Authorized users only. All activities may be monitored and reported.
salt.repo                                               100%  314   785.3KB/s   00:00    
[root@node01 ~]# scp /etc/yum.repos.d/salt.repo node3:/etc/yum.repos.d/

Authorized users only. All activities may be monitored and reported.
salt.repo                                               100%  314   822.3KB/s   00:00  

3. saltstack安装

3.1 master节点

master节点需要安装2个包salt-mastersalt-ssh,直接采用yum安装

[root@node01 ~]# yum install salt-master salt-ssh -y

3.2 minion节点

minion节点就只需要安装一个包salt-minion

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

4. 配置saltstack

4.1 master节点配置

在安装好master节点所需要的包之后会在/etc/salt目录下有一个master文件,这是默认的配置文件,我们最好不要去修改它,我们可以将它作为一个模板来抄配置,我们自己的配置文件可以放在/etc/salt/master.d/这个目录下

[root@node01 ~]# vim /etc/salt/master.d/master.conf
interface: 0.0.0.0
publish_port: 4505
ret_port: 4506
pki_dir: /etc/salt/pki/master
file_roots:
  base:
    - /srv/salt/
pillar_roots:
  base:
    - /src/pillar

这段配置指定了以下内容:

  1. interface 0.0.0.0: Salt Master 监听所有网络接口上的请求。
  2. 使用端口 4505 来发布消息,使用端口 4506 来接收 Minion 返回的结果。
  3. 加密通信的密钥存放在 /etc/salt/pki/master 目录中。
  4. Salt 文件服务器的根目录为 /srv/salt/,用于存放 state 文件和相关资源。
  5. Pillar 数据存放在 /src/pillar 目录中。

这是一个yaml格式的配置文件,不要使用tab键,使用空格来缩进,接下来我们启动master

[root@node01 salt]# mkdir -p /srv/salt/ /src/pillar 
[root@node01 salt]# systemctl restart salt-master

4.2 配置minion节点

minion节点同样的,不要直接去修改/etc/salt/minion,我们在/etc/salt/minion.d/目录下去写配置

[root@node02 salt]# vim /etc/salt/minion.d/minion.conf
master: 192.168.200.179
id: 192.168.200.180      # 如果你写的hosts文件的话这里可以直接写主机名
[root@node03 minion.d]# vim minion.conf
master: 192.168.200.179
id: node3

将2中情况都写了出来,如果你配置了hosts文件可以采用下面这种方式

启动minion

[root@node2 minion.d]# systemctl restart salt-minion.service
[root@node3 minion.d]# systemctl restart salt-minion.service

这个时候服务就启动了,你如果使用systemctl status salt-minion去看服务的状态的话,你会发现服务是有报错的

● salt-minion.service - The Salt Minion
     Loaded: loaded (/usr/lib/systemd/system/salt-minion.service; disabled; vendor preset: disabled)
     Active: active (running) since Fri 2024-07-12 15:55:26 CST; 3min 34s ago
       Docs: man:salt-minion(1)
             file:///usr/share/doc/salt/html/contents.html
             https://docs.saltproject.io/en/latest/contents.html
   Main PID: 2504 (python3.10)
      Tasks: 7 (limit: 8917)
     Memory: 57.2M
     CGroup: /system.slice/salt-minion.service
             ├─ 2504 /opt/saltstack/salt/bin/python3.10 /usr/bin/salt-minion
             └─ 2511 "/opt/saltstack/salt/bin/python3.10 /usr/bin/salt-minion MultiMinionProcessManager MinionProcessManager"

Jul 12 15:57:22 node03 salt-minion[2511]: [ERROR   ] The Salt Master has cached the public key for this node, this salt minion will wait for 10 seconds before>
Jul 12 15:57:32 node03 salt-minion[2511]: [ERROR   ] The Salt Master has cached the public key for this node, this salt minion will wait for 10 seconds before>
Jul 12 15:57:42 node03 salt-minion[2511]: [ERROR   ] The Salt Master has cached the public key for this node, this salt minion will wait for 10 seconds before>
Jul 12 15:57:52 node03 salt-minion[2511]: [ERROR   ] The Salt Master has cached the public key for this node, this salt minion will wait for 10 seconds before>
Jul 12 15:58:02 node03 salt-minion[2511]: [ERROR   ] The Salt Master has cached the public key for this node, this salt minion will wait for 10 seconds before>
Jul 12 15:58:12 node03 salt-minion[2511]: [ERROR   ] The Salt Master has cached the public key for this node, this salt minion will wait for 10 seconds before>
Jul 12 15:58:22 node03 salt-minion[2511]: [ERROR   ] The Salt Master has cached the public key for this node, this salt minion will wait for 10 seconds before>
Jul 12 15:58:33 node03 salt-minion[2511]: [ERROR   ] The Salt Master has cached the public key for this node, this salt minion will wait for 10 seconds before>
Jul 12 15:58:43 node03 salt-minion[2511]: [ERROR   ] The Salt Master has cached the public key for this node, this salt minion will wait for 10 seconds before>
Jul 12 15:58:53 node03 salt-minion[2511]: [ERROR   ] The Salt Master has cached the public key for this node, this salt minion will wait for 10 seconds before

这个报错我们不必理会,这是因为我们的master节点还没有接受他们的公钥

5. 接受认证公钥

在接受之前我们可以先查看一下,在master节点

[root@node01 salt]# salt-key
Accepted Keys:
Denied Keys:
Unaccepted Keys:
192.168.200.180
node3
Rejected Keys:

这里显示没有接受的公钥有2个,一个是192.168.200.180,另一个是node3

接下来我们接受公钥

# 接受某个公钥
[root@node01 salt]# salt-key -a 192.168.200.180 
The following keys are going to be accepted:
Unaccepted Keys:
192.168.200.180
Proceed? [n/Y] y
Key for minion 192.168.200.180 accepted.
[root@node01 salt]# salt-key
Accepted Keys:
192.168.200.180
Denied Keys:
Unaccepted Keys:
node3
Rejected Keys:
# 接受全部公钥
[root@node01 salt]# salt-key -A
  • -a :指定接受某一个公钥
  • -A : 接受全部
  • -d: 删除某一个公钥
  • -D:删除全部

6. 测试

公钥都接收好了之后我们来试一下能不能管理节点了

[root@node1 ~]# salt '*' test.ping 
node3:
    True
192.168.200.180:
    True

返回True就代表这个节点OK了

[root@node1 ~]# salt '*' cmd.run 'echo saltstack > /tmp/salt'
192.168.200.180:
node3:

这个命令就是输出saltstack并且重定向到/tmp/salt这个文件,我们可以到node2和node3上查看这个文件

[root@node1 ~]# salt '*' cmd.run 'cat /tmp/salt'
192.168.200.180:
    saltstack
node3:
    saltstack

saltstack也可以跟ansible一样定义主机组,但是定义的方式不用,我们来定义一个看看

7. 定义主机组

在master节点上的/etc/salt/master.d/下创建一个文件

[root@node1 ~]# vim /etc/salt/master.d/groups.conf
nodegroups:
  webserver:
    - 192.168.200.180
    - node3

这样我们就定义了一个webserver的主机组,里面包含2个主机

对主机组操作是这样的

[root@node1 ~]# salt -N 'webserver' test.ping
192.168.200.180:
    True
node3:
    True

需要加上 -N,然后指定主机组的名字

Grains变量

grains变量与ansible的facts变量是差不多的,ansible里面可以通过setup模块来收集,saltstack里则是这样的

[root@node1 ~]# salt  'node3' grains.items |wc -l
385

内容非常的多,我就截取一点内容

node3:
    ----------
    biosreleasedate:
        11/12/2020
    biosvendor:
        Phoenix Technologies LTD
    biosversion:
        6.00
    boardname:
        440BX Desktop Reference Platform
    cpu_flags:
        - fpu
        - vme
        - de
        - pse
        - tsc
        - msr
        - pae
        - mce
        - cx8
        - apic
        - sep
        - mtrr
        ……………………省略

我们还可以过滤内容

[root@node1 ~]# salt  'node3' grains.items |grep -A 3 ipv4
    ipv4:
        - 127.0.0.1
        - 192.168.200.172
        - 192.168.200.200

或者直接使用自带的过滤器

[root@node1 ~]# salt  'node3' grains.item 
node3:
    ----------
[root@node1 ~]# salt  'node3' grains.item ipv4
node3:
    ----------
    ipv4:
        - 127.0.0.1
        - 192.168.200.172
        - 192.168.200.200

注意,列出全部的变量是grains.items,而过滤指定的内容是grains.item ,注意区别

模块

1. 查询支持的模块

[root@node1 ~]# salt 'node3' sys.list_modules
node3:
    - acl
    - aliases
    - alternatives
    - archive
    - artifactory
    - baredoc
    - beacons
    - bigip
    - btrfs
    - buildout
    - chroot
    - cloud
    - cmd
    - composer
    - config
    - consul
    - container_resource
    - cp
…………省略

我这里一共是172个模块

[root@node1 ~]# salt 'node3' sys.list_modules  |wc -l
172

2. 查询某个模块的具体使用方法

像ansible里面的ansible-doc一样,saltstack也可以查询模块的具体使用方式

# 查询pip模块
[root@node1 ~]# salt 'node3' sys.doc pip

执行这个会输出非常多的内容,你找到你想要的内容然后他里面是有写CLI Example的,你照着他的Example改就好了

3. 被控节点安装软件

要安装软件包与ansible是不一样的,ansible里面你如果控制的是RHEL系列的包是使用yum,Debain系列使用apt,而在saltstack里则全都是使用pkg模块

# 安装一个vsftpd
[root@node1 ~]# salt '*' pkg.install pkgs='["vsftpd"]'
node3:
    ----------
    vsftpd:
        ----------
        new:
            3.0.3-33.oe2203sp3
        old:
192.168.200.180:
    ----------
    vsftpd:
        ----------
        new:
            3.0.3-33.oe2203sp3
        old:

这样ftp就被安装在各个节点上了,如果需要一次性安装多个则在中括号里面用逗号隔开,多写几个就可以了

如果只需要安装单个的包也可以这样写

[root@node1 ~]# salt '*' pkg.install httpd
192.168.200.180:
    ----------
    apr:
        ----------
        new:
            1.7.0-6.oe2203sp3
        old:
    apr-util:
        ----------
        new:
            1.6.1-14.oe2203sp3
        old:
    httpd:
        ----------
        new:
            2.4.51-21.oe2203sp3
        old:
    httpd-filesystem:
        ----------
        new:
            2.4.51-21.oe2203sp3
        old:
    httpd-tools:
        ----------
        new:
            2.4.51-21.oe2203sp3
        old:
    mailcap:
        ----------
        new:
            2.1.53-3.oe2203sp3
        old:
    mod_http2:
        ----------
        new:
            1.15.25-3.oe2203sp3
        old:
    openEuler-logos-httpd:
        ----------
        new:
            1.0-8.oe2203sp3
        old:
node3:
    ----------
    apr:
        ----------
        new:
            1.7.0-6.oe2203sp3
        old:
    apr-util:
        ----------
        new:
            1.6.1-14.oe2203sp3
        old:
    httpd:
        ----------
        new:
            2.4.51-21.oe2203sp3
        old:
    httpd-filesystem:
        ----------
        new:
            2.4.51-21.oe2203sp3
        old:
    httpd-tools:
        ----------
        new:
            2.4.51-21.oe2203sp3
        old:
    mailcap:
        ----------
        new:
            2.1.53-3.oe2203sp3
        old:
    mod_http2:
        ----------
        new:
            1.15.25-3.oe2203sp3
        old:
    openEuler-logos-httpd:
        ----------
        new:
            1.0-8.oe2203sp3
        old:

就是直接在install后面加上需要安装的软件包就行了

这里不需要指定yum或者apt的原因是因为,咱们是在被控节点安装了agent的,也就是salt-minion这个包,你装在不同的系统上这个包肯定就会不一样对吧,所以他是通过这个来区分的,而ansble需要指定是因为ansible是无代理的,直接使用ssh,而不管是RHEL还是Debain都是可以ssh的,所以ansible并不知道你要控制的节点的系统,则需要手动指定

4. 查询某个模块具体有哪些函数

[root@node1 ~]# salt 'node3' sys.doc pkg |grep ^pkg
pkg.available_version:
pkg.clean_metadata:
pkg.del_repo:
pkg.diff:
pkg.download:
pkg.file_dict:
pkg.file_list:
pkg.get_locked_packages:
pkg.get_repo:
pkg.group_diff:
pkg.group_info:
pkg.group_install:
pkg.group_list:
pkg.groupinstall:
pkg.hold:
pkg.info_installed:
pkg.install:
pkg.latest_version:
pkg.list_downloaded:
pkg.list_holds:
pkg.list_installed_patches:
pkg.list_patches:
pkg.list_pkgs:
pkg.list_repo_pkgs:
pkg.list_repos:
pkg.list_updates:
pkg.list_upgrades:
pkg.mod_repo:
pkg.modified:
pkg.normalize_name:
pkg.owner:
pkg.parse_arch:
pkg.purge:
pkg.refresh_db:
pkg.remove:
pkg.services_need_restart:
pkg.unhold:
pkg.update:
pkg.upgrade:
pkg.upgrade_available:
pkg.verify:
pkg.version:
pkg.version_cmp:

与saltStack自动化工具相似的内容: