joeの小窝

Loading...

saltstack自动化工具

一、saltstack自动化工具

SaltStack是一个功能强大、灵活且高效的自动化运维工具。它基于Python开发,采用零配置通信和事件驱动的架构,能够帮助系统管理员和开发人员轻松管理成千上万台服务器,实现配置管理、远程执行、云管理等核心任务

1、核心概念

1、master和minion

  • master: saltstack的主服务器,负责管理和控制多个minion,master发送命令,收集数据并进行协调

  • minion 被管理的节点,接收master命令并执行

2、state

  • state: 描述系统应该处于的状态,通常用yaml格式编写,安装某个软件包,配置某个服务

  • state file 存储state文件,通常以.sls结尾

3、pillar(动态变量/数据)

  • 存储敏感数据和配置信息,密码,密钥,是master特定的,在master上面定义

  • 存储被控节点的密码,或者配置管理需要读取的一些变量

4、grains(静态变量/数据)

  • 在被控节点收集主机信息,类似于ansible的facts变量,同时支持自定义的grains的变量,grains的所有变量和信息都在被管理节点上定义

  • 描述minion的特性,ip地址,内存等

5、modules

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

6、runner

  • 在master上执行的任务,用于进行一些复杂的管理操作,管理批量任务,监控等

7、reactor

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

img

2、saltstack工作流程

  1. 命令发送:管理员在master上发送命令

  2. 命令分发:master将命令分发给目标minion

  3. 命令执行:minion接收到命令后执行相应的操作

  4. 结果返回:minion将执行结果返回给master

  5. 结果汇总:master汇总并展示执行结果

  • saltstack工作原理

    • master和minion之间需要进行认证,所有角色都会产生2把密钥,一把公钥,一把私钥

    • 当minion启动后会向master节点发送公钥,当master节点接收公钥后,就会向minion注册

    • 当认证完成后,就会通过4505和4506来进行任务的发布和执行,由master发布任务,minion执行任务

3、安装saltstack

1、配置yum源

# 每个节点都需要配置

[root@server yum.repos.d]# curl -fsSL https://github.com/saltstack/salt-install-guide/releases/latest/download/salt.repo | sudo tee /etc/yum.repos.d/salt.repo

# 上面的地址是官网的,特别的慢,下面换成了阿里云的地址了,发现阿里云的地址没有维护了,还是使用官网的repo文件

master需要安装2个软件包

# 安装master控制节点程序
yum -y install salt-master

# 安装saltstack对ssh的插件的支持
yum -y install salt-ssh

minion节点只需要安装一个包

yum -y install salt-minion

2、配置域名解析

  • 每个节点都需要配置
# 等会发送公钥的时候,就能识别到了

[root@node2 ~]# cat /etc/hosts 
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.50.21 node1
192.168.50.22 node2
192.168.50.20 master

3、master节点配置

  • 安装软件包后,查看生成的文件有哪些
[root@server salt]# rpm -qc salt-master
/etc/salt/master
[root@server salt]# rpm -qc salt-ssh
/etc/salt/roster

[root@server salt]# ls 
master  master.d  pki  roster

  • 其中master是主要的配置文件,master.d里面是存放配置文件的

  • master是默认的配置文件,不需要动他,只需要在master.d里面配置即可

  • 以.conf结尾

[root@server master.d]# cat master.conf 
interface: 0.0.0.0   # master 监听所有网络接口上的请求
publish_port: 4505  # 使用4505发布消息,通信的端口
ret_port: 4506    # 4506接收minion返回的结果,定义认证,数据传输的端口
pki_dir: /etc/salt/pki/master   # 定义收到minion(公钥)证书存放的位置
file_roots:   # 定义状态配置文件,sls文件的目录
  base:   # base是通用的环境,默认的环境
    - /srv/salt/
pillar_roots:  # 定义pillar变量存储的位置
   base:
    - /srv/pillar/

  • file_roots 定义状态配置的目录,如果定义了不同的目录,就相当于是定义不同的环境,运维,开发,测试等
# 创建目录

[root@server master.d]# mkdir /srv/salt /srv/pillar
[root@server master.d]# ls /srv/
pillar  salt

# 启动salt-master服务
systemctl start salt-master

4、minion配置

[root@node1 minion.d]# cat minion.conf 
master: 192.168.50.20  # 可以是是字符串,或者是ip地址,但必须被正常解析到才行,在生产中使用ip地址找到master
id: node1   # 指的是客户端的名称,必须被dns解析,因此之前的域名解析是必须要做的

[root@node2 minion.d]# cat minion.conf 
master: 192.168.50.20
id: node2


# 启动服务
systemctl start salt-minion

5、配置master和minion之间的认证

  • master接收minion发送的公钥
[root@server salt]# salt-key 
Accepted Keys:
Denied Keys:
Unaccepted Keys:  # 没有接受的公钥,发现有2个
node1
node2
Rejected Keys:

# 现在来接受一下

# -a 接受某个公钥
[root@server salt]# salt-key -a node1  
The following keys are going to be accepted:
Unaccepted Keys:
node1
Proceed? [n/Y] y
Key for minion node1 accepted.

# -A 接受所有公钥
[root@server salt]# salt-key -A
The following keys are going to be accepted:
Unaccepted Keys:
node2
Proceed? [n/Y] y
Key for minion node2 accepted.

# 查看公钥状态
[root@server salt]# salt-key 
Accepted Keys:
node1
node2
Denied Keys:
Unaccepted Keys:
Rejected Keys:



#  这个里面就是被控节点发送的密钥在主控节点上面了
[root@server minions]# ls
node1  node2

  • salt-key的用法 发现所有客户端发给控制节点的密钥

    • -a 指定接受某个公钥

    • -A 接受全部

    • -d 删除某一个公钥

    • -D 删除全部

    • -j 拒绝指定密钥

    • -L 列出全部密钥

  • 如果salt-key 等待的时间很久的话,检查域名解析是否正常配置了,能否解析到控制节点和被控节点

6、测试一下,是否成功

# 返回了true,表示成功了

[root@server salt]# salt "*" test.ping
node1:
    True
node2:
    True

4、saltstack操作方法

1、saltstack执行任务

  • 通过模块来执行任务
salt 选项 目标  函数 参数

# 选项  控制salt命令本身的行为,控制超时,等等信息(可选的),控制怎么定义主机,是以哪种方式来控制的主机

# 目标 指的定义目标的方式(通过哪种方式来定义主机)

# 函数 salt执行的具体动作,被组织在模块中

# 参数  指的是模块的参数

2、目标主机的选择方式

使用通配符来指定

[root@server ~]# salt "node*" test.ping
node2:
    True
node1:
    True

使用列表的方式

[root@server ~]# salt -L "node1,node2" test.ping
node1:
    True
node2:
    True

使用正则匹配主机

[root@server ~]# salt -E "^n" test.ping
node2:
    True
node1:
    True

通过pillar指定主机

# 需要定义pillar变量文件
[root@server pillar]# ls
test.sls  top.sls
[root@server pillar]# cat test.sls 
stacktest: openeuler
[root@server pillar]# cat top.sls 
base:
  'node1':
     - test

# 哪些主机有这些变量,从而进行选择
[root@server master.d]# salt -I 'stacktest:openeuler' test.ping
node1:
    True

通过grains指定主机

# 通过ip地址来选择node2主机
[root@server ~]# salt -G "ipv4:192.168.50.22" test.ping
node2:
    True

混合方式指定主机

[root@server ~]# salt -C "G@ipv4:192.168.50.21 or node*" test.ping
node1:
    True
node2:
    True

通过网络信息指定主机

[root@server ~]# salt -S "192.168.50.0/24"  test.ping
node1:
    True
node2:
    True

通过主机组的方式来指定主机

[root@server master.d]# cat nodegroups.conf 
nodegroups: # 顶层写nodegroups
  group1:  # 主机组
    node1 
  group2:
    node2

# 上面只能定义主机组,里面不能写变量文件
[root@server master.d]# salt -N 'group1' test.ping
node1:
    True

3、grains变量

  • 存放minion主机的信息,也可以自定义变量

收集被控节点的静态数据

# grains这个关键字

[root@server master.d]# salt "node1" grains.items
# 有非常多的数据,类似ansible的facts变量

过滤指定的grains的数据

# 注意不需要items
# 过滤出磁盘信息
[root@server master.d]# salt "node1" grains.item disks
node1:
    ----------
    disks:
        - sr0
        - sda


# 过滤出ip地址
[root@server master.d]# salt "node1" grains.item ipv4
node1:
    ----------
    ipv4:
        - 127.0.0.1
        - 192.168.50.21
        - 192.168.100.21

自定义grains变量

# 在被控节点上面创建grains变量

[root@node1 minion.d]# cat grains.conf 
grains:  # 必须以grains开头
  webserver: nginx   # key: value 键值对的方式
  webversion: 1.0

# 重启salt-minion服务

systemctl restart salt-minion

# 搜索自定义grains变量

[root@server salt]# salt "node1" grains.item webserver
node1:
    ----------
    webserver:
        nginx

4、pillar变量

主要定义被控节点的敏感信息

# 在/srv/pillar下面创建文件
[root@server master.d]# ls /srv/pillar/
test.sls  top.sls

# 自定义变量文件
[root@server master.d]# cat /srv/pillar/test.sls 
stacktest: openeuler

# 定义这个变量在哪个环境下面使用,哪些主机能使用
[root@server master.d]# cat /srv/pillar/top.sls 
base:  # base这个环境下使用
  'node1':  # node1这个主机  * 表示任何主机
     - test  # 使用test.sls这个文件里面的变量  


# 2个配置文件 就是说 在base这个环境下面,node1可以使用test.sls这个文件里面的变量


测试pillar变量

[root@server master.d]# salt "node1" pillar.items
node1:
    ----------
    stacktest:
        openeuler

刷新所有pillar变量信息

[root@server master.d]# salt "*" saltutil.refresh_pillar
node2:
    True
node1:
    True

5、模块的操作

查询被控端支持的所有模块

[root@server salt]# salt "node1" sys.list_modules

查询模块详细和帮助

# 一个模块里面有很多的函数
[root@server salt]# salt "node1" sys.doc pkg

# 里面有案例

查询模块中一个具体的函数用法

# 模块.函数名
[root@server salt]# salt "node1" sys.doc user.rename

查询某个模块所有的函数

[root@server pillar]# salt 'node1' 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:

在minion节点安装vsftpd

[root@server salt]# salt "*" pkg.install vsftpd
node2:
    ----------
    vsftpd:
        ----------
        new:
            3.0.3-33.oe2203sp3
        old:
node1:
    ----------
    vsftpd:
        ----------
        new:
            3.0.3-33.oe2203sp3
        old:

5、常见的模块

1、pkg模块

  • 无论是rpm还是deb的包,都可以安装

2、network模块

  • 测试网络的

3、service模块

4、cmd模块

  • cmd.run shell命令

5、file模块

6、state模块

  • 状态管理模块
[root@server ~]# salt "node1" status.meminfo

6、批量配置管理

state模块,通过state模块的配置文件,sls状态配置文件,在这个文件定义多个任务实现配置的批量管理

  • top.sls 是全局的环境管理配置文件,用来决定那套环境,哪些主机使用sls的配置文件

  • test.sls 用来定义具体的功能实现,也就是模块要执行的任务都在这个文件定义

案例1

# 非常的麻烦,因为这个模块的参数需要查询,,查询帮助命令里面又没有,需要看其他的文档,或者问ai,这个yaml格式没有ansible方便
[root@server base]# cat test.sls 
install_httpd:  # 任务的描述信息
  pkg.installed:
    - name: httpd
start_service:
  service.running:
    - name: httpd
modify_index_html:
  file.managed:
    - name: /var/www/html/index.html
    - contents: "hello openeuler"

# salt 主机  state.sls 文件名,不需要.sls结尾
[root@server base]# salt "*" state.sls test

Summary for node1
------------
Succeeded: 3 (changed=2)  # 成功了
Failed:    0
------------
Total states run:     3
Total run time: 244.840 ms

如果又多个sls文件的话

[root@server base]# ls
euler.sls  test.sls  top.sls
[root@server base]# cat top.sls 
base:
  "*":
     - test
     - euler

# 会自动的去base目录下面站这2个文件
[root@server base]# salt "*" state.apply

# 或者 state.highstate 跟上面一样的效果
  • 多套环境下指定salt * state.apply saltenv=base(环境名)

总结

  • 有点麻烦,yaml文件的模块参数需要自己去找,没有ansible-doc方便
posted @ 2026-03-05 22:07  乔的港口  阅读(31)  评论(0)    收藏  举报