经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » Linux/Shell » 查看文章
saltStack自动化工具
来源:cnblogs  作者:FuShudi  时间:2024/7/12 19:05:17  对本文有异议

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解析

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

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

2. 配置yum源

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

地址

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

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

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

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

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

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

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

3. saltstack安装

3.1 master节点

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

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

3.2 minion节点

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

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

4. 配置saltstack

4.1 master节点配置

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

  1. [root@node01 ~]# vim /etc/salt/master.d/master.conf
  2. interface: 0.0.0.0
  3. publish_port: 4505
  4. ret_port: 4506
  5. pki_dir: /etc/salt/pki/master
  6. file_roots:
  7. base:
  8. - /srv/salt/
  9. pillar_roots:
  10. base:
  11. - /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

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

4.2 配置minion节点

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

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

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

启动minion

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

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

  1. salt-minion.service - The Salt Minion
  2. Loaded: loaded (/usr/lib/systemd/system/salt-minion.service; disabled; vendor preset: disabled)
  3. Active: active (running) since Fri 2024-07-12 15:55:26 CST; 3min 34s ago
  4. Docs: man:salt-minion(1)
  5. file:///usr/share/doc/salt/html/contents.html
  6. https://docs.saltproject.io/en/latest/contents.html
  7. Main PID: 2504 (python3.10)
  8. Tasks: 7 (limit: 8917)
  9. Memory: 57.2M
  10. CGroup: /system.slice/salt-minion.service
  11. ├─ 2504 /opt/saltstack/salt/bin/python3.10 /usr/bin/salt-minion
  12. └─ 2511 "/opt/saltstack/salt/bin/python3.10 /usr/bin/salt-minion MultiMinionProcessManager MinionProcessManager"
  13. 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>
  14. 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>
  15. 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>
  16. 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>
  17. 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>
  18. 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>
  19. 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>
  20. 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>
  21. 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>
  22. 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节点

  1. [root@node01 salt]# salt-key
  2. Accepted Keys:
  3. Denied Keys:
  4. Unaccepted Keys:
  5. 192.168.200.180
  6. node3
  7. Rejected Keys:

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

接下来我们接受公钥

  1. # 接受某个公钥
  2. [root@node01 salt]# salt-key -a 192.168.200.180
  3. The following keys are going to be accepted:
  4. Unaccepted Keys:
  5. 192.168.200.180
  6. Proceed? [n/Y] y
  7. Key for minion 192.168.200.180 accepted.
  8. [root@node01 salt]# salt-key
  9. Accepted Keys:
  10. 192.168.200.180
  11. Denied Keys:
  12. Unaccepted Keys:
  13. node3
  14. Rejected Keys:
  15. # 接受全部公钥
  16. [root@node01 salt]# salt-key -A
  • -a :指定接受某一个公钥
  • -A : 接受全部
  • -d: 删除某一个公钥
  • -D:删除全部

6. 测试

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

  1. [root@node1 ~]# salt '*' test.ping
  2. node3:
  3. True
  4. 192.168.200.180:
  5. True

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

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

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

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

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

7. 定义主机组

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

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

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

对主机组操作是这样的

  1. [root@node1 ~]# salt -N 'webserver' test.ping
  2. 192.168.200.180:
  3. True
  4. node3:
  5. True

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

Grains变量

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

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

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

  1. node3:
  2. ----------
  3. biosreleasedate:
  4. 11/12/2020
  5. biosvendor:
  6. Phoenix Technologies LTD
  7. biosversion:
  8. 6.00
  9. boardname:
  10. 440BX Desktop Reference Platform
  11. cpu_flags:
  12. - fpu
  13. - vme
  14. - de
  15. - pse
  16. - tsc
  17. - msr
  18. - pae
  19. - mce
  20. - cx8
  21. - apic
  22. - sep
  23. - mtrr
  24. ……………………省略

我们还可以过滤内容

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

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

  1. [root@node1 ~]# salt 'node3' grains.item
  2. node3:
  3. ----------
  4. [root@node1 ~]# salt 'node3' grains.item ipv4
  5. node3:
  6. ----------
  7. ipv4:
  8. - 127.0.0.1
  9. - 192.168.200.172
  10. - 192.168.200.200

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

模块

1. 查询支持的模块

  1. [root@node1 ~]# salt 'node3' sys.list_modules
  2. node3:
  3. - acl
  4. - aliases
  5. - alternatives
  6. - archive
  7. - artifactory
  8. - baredoc
  9. - beacons
  10. - bigip
  11. - btrfs
  12. - buildout
  13. - chroot
  14. - cloud
  15. - cmd
  16. - composer
  17. - config
  18. - consul
  19. - container_resource
  20. - cp
  21. …………省略

我这里一共是172个模块

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

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

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

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

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

3. 被控节点安装软件

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

  1. # 安装一个vsftpd
  2. [root@node1 ~]# salt '*' pkg.install pkgs='["vsftpd"]'
  3. node3:
  4. ----------
  5. vsftpd:
  6. ----------
  7. new:
  8. 3.0.3-33.oe2203sp3
  9. old:
  10. 192.168.200.180:
  11. ----------
  12. vsftpd:
  13. ----------
  14. new:
  15. 3.0.3-33.oe2203sp3
  16. old:

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

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

  1. [root@node1 ~]# salt '*' pkg.install httpd
  2. 192.168.200.180:
  3. ----------
  4. apr:
  5. ----------
  6. new:
  7. 1.7.0-6.oe2203sp3
  8. old:
  9. apr-util:
  10. ----------
  11. new:
  12. 1.6.1-14.oe2203sp3
  13. old:
  14. httpd:
  15. ----------
  16. new:
  17. 2.4.51-21.oe2203sp3
  18. old:
  19. httpd-filesystem:
  20. ----------
  21. new:
  22. 2.4.51-21.oe2203sp3
  23. old:
  24. httpd-tools:
  25. ----------
  26. new:
  27. 2.4.51-21.oe2203sp3
  28. old:
  29. mailcap:
  30. ----------
  31. new:
  32. 2.1.53-3.oe2203sp3
  33. old:
  34. mod_http2:
  35. ----------
  36. new:
  37. 1.15.25-3.oe2203sp3
  38. old:
  39. openEuler-logos-httpd:
  40. ----------
  41. new:
  42. 1.0-8.oe2203sp3
  43. old:
  44. node3:
  45. ----------
  46. apr:
  47. ----------
  48. new:
  49. 1.7.0-6.oe2203sp3
  50. old:
  51. apr-util:
  52. ----------
  53. new:
  54. 1.6.1-14.oe2203sp3
  55. old:
  56. httpd:
  57. ----------
  58. new:
  59. 2.4.51-21.oe2203sp3
  60. old:
  61. httpd-filesystem:
  62. ----------
  63. new:
  64. 2.4.51-21.oe2203sp3
  65. old:
  66. httpd-tools:
  67. ----------
  68. new:
  69. 2.4.51-21.oe2203sp3
  70. old:
  71. mailcap:
  72. ----------
  73. new:
  74. 2.1.53-3.oe2203sp3
  75. old:
  76. mod_http2:
  77. ----------
  78. new:
  79. 1.15.25-3.oe2203sp3
  80. old:
  81. openEuler-logos-httpd:
  82. ----------
  83. new:
  84. 1.0-8.oe2203sp3
  85. old:

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

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

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

  1. [root@node1 ~]# salt 'node3' sys.doc pkg |grep ^pkg
  2. pkg.available_version:
  3. pkg.clean_metadata:
  4. pkg.del_repo:
  5. pkg.diff:
  6. pkg.download:
  7. pkg.file_dict:
  8. pkg.file_list:
  9. pkg.get_locked_packages:
  10. pkg.get_repo:
  11. pkg.group_diff:
  12. pkg.group_info:
  13. pkg.group_install:
  14. pkg.group_list:
  15. pkg.groupinstall:
  16. pkg.hold:
  17. pkg.info_installed:
  18. pkg.install:
  19. pkg.latest_version:
  20. pkg.list_downloaded:
  21. pkg.list_holds:
  22. pkg.list_installed_patches:
  23. pkg.list_patches:
  24. pkg.list_pkgs:
  25. pkg.list_repo_pkgs:
  26. pkg.list_repos:
  27. pkg.list_updates:
  28. pkg.list_upgrades:
  29. pkg.mod_repo:
  30. pkg.modified:
  31. pkg.normalize_name:
  32. pkg.owner:
  33. pkg.parse_arch:
  34. pkg.purge:
  35. pkg.refresh_db:
  36. pkg.remove:
  37. pkg.services_need_restart:
  38. pkg.unhold:
  39. pkg.update:
  40. pkg.upgrade:
  41. pkg.upgrade_available:
  42. pkg.verify:
  43. pkg.version:
  44. pkg.version_cmp:

原文链接:https://www.cnblogs.com/fsdstudy/p/18299149

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号