自动化运维之SaltStack 部署应用

news2024/12/25 9:08:55

 💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。

推荐:Linux运维老纪的首页,持续学习,不断总结,共同进步,活到老学到老
导航剑指大厂系列:全面总结 运维核心技术:系统基础、数据库、网路技术、系统安全、自动化运维、容器技术、监控工具、脚本编程、云服务等。
常用运维工具系列:常用的运维开发工具, zabbix、nagios、docker、k8s、puppet、ansible等
数据库系列:详细总结了常用数据库 mysql、Redis、MongoDB、oracle 技术点,以及工作中遇到的 mysql 问题等
懒人运维系列:总结好用的命令,解放双手不香吗?能用一个命令完成绝不用两个操作
数据结构与算法系列:总结数据结构和算法,不同类型针对性训练,提升编程思维,剑指大厂
非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨

自动化运维之SaltStack 部署应用
技能目标
- 掌握 SaltStack 的原理和安装
- 掌握 SaltStack 的常用模块
- 掌握SaltStackgrains
pillar、state

1.1 SaltStack 基础

在生产环境中,服务器往往不只是一台,有可能是成千上万台。对于运维人员来说,如
果单独的对每台服务器进行管理,工作难度比较大。这时部署自动化运维就可以尽可
能安全、高效的完成这些工作。
一般,会把自动化运维工具划分为两类:一类是需要使用代理工具的,也就是基
于专用的 Agent 程序来完成管理功能,如:SaltStackPuppetFuncZabbix 等;
另外一类是不需要配置代理工具的,可以直接基于 SSH 服务来完成管理功能,如:
AnsibleFabric 等。本章将主要介绍自动化运维工具 SaltStack 是如何实现自动化运
维部署的。下面是几款功能类似的自动化运维工具。
SaltStack:是一个服务器基础设施管理工具,它具有配置管理、远程执行、监控等功
能。SaltStack Python 语言编写,是非常简单易用和轻量级的管理工具。
Ansible:是基于 Python 开发的,集合了众多优秀运维工具的优点,实现了批量
运行命令、部署程序、配置系统等功能的自动化运维管理工具。默认通过 SSH
协议进行远程命令执行或下发配置,无需部署任何客户端代理软件,从而使得自
动化环境部署变得更加简单。可同时支持多台主机并行管理,使得管理主机更加
便捷。
Puppet:是基于 Ruby 开发的,支持 LinuxUnixWindows 平台的自动化运维
管理工具,可以针对用户、系统服务、配置文件、软件包等进行管理,有很强的
扩展性,但远程执行命令相对较弱。
针对这几款自动化运维工具比较如表 1-1 所示。
1-1 自动化运维工具比较
工具开发语言结构配置文件格式运行任务
AnsiblePythonYAML支持命令行
SaltStackPythonC/SYAML支持命令行
PuppetRubyC/SRuby 语法格式通过模块实现

通过部署 SaltStack 环境,可以在成千上万台服务器上批量执行命令,对于不同的业务

进行集中管理、分发文件、采集数据、软件包管理等。有利于运维人员提高工作效率、规范
业务配置和操作。

1.SaltStack 原理

SaltStack Master Minion 构成,Master 是服务器端,表示一台服务器,Minion
是客户服务器端,表示多台服务器。在 Master 上发送命令给符合条件的 MinionMinion
会执行相应的命令。Master Minion 之间是通过 ZeroMQ(消息队列)进行通信。
SaltStack Master 端监听 4505 4506 端口,4505 SaltStack 的消息发布端口,
4506 SaltStack 客户端与服务端通信的端口。SaltStack 客户端程序并不监听端口,当客
户端启动后,会主动连接 Master 端注册,然后一直保持该 TCP 连接,而 Master 通过这条
TCP 连接对客户端进行控制。如果连接断开,Master 对客户端将不能进行控制。但是,当
客户端检查到连接断开后,会定期的向 Master 端请求注册连接。

2.SaltStack 安装

SaltStack Master Minion 安装非常简单,在 CentOS 系统中的安装步骤如下。
(1)安装 EPEL 源
CentOS 官方 YUM 源中没有 SaltStack 的安装包支持,需要先安装第三方的 EPEL
作为部署 SaltStack YUM 源,具体操作如下所示。
[root@master ~]# yum install -y epel-release
//Master Minion 均需要操作
(2)安装 Master
Master 端上安装 salt-master 软件,具体操作如下所示。
[root@master ~]# yum install -y salt-master
(3)安装 Minion
Minion 端上安装 salt-minion 软件,具体操作如下所示。
[root@minion ~]# yum install -y salt-minion
(4)配置 Master
修改 Master 的配置文件,具体操作如下所示。
[root@master ~]# vim /etc/salt/master
interface: 192.168.9.233
//设置监听的地址
auto_accept: True
//设置自动接受客户端发送过来的 Key,如果服务器很多的话,
需要开启该功能
修改后可以启动 Master,具体操作如下所示。
[root@master ~]# systemctl start salt-master
[root@master ~]# systemctl enable salt-master
Created
symlink
from
/etc/systemd/system/multi-user.target.wants/salt-master.service
to
/usr/lib/systemd/system/salt-master.service.
(5)配置 Minion
修改 Minion 的配置文件,具体操作如下所示。
[root@minion ~]# vim /etc/salt/minion
master: 192.168.9.233
//改成前面的 Master 服务器地址
id: minion.saltstack.com
//建议这里修改成主机名,便于 Master 端识别
......
//省略内容
//在配置文件末尾加入下面内容,设置每隔 10 分钟自动同步 Master 配置。其效果等同于在客户端执
salt-call state.highstate 或在 server 端执行 salt ‘*‘state.highstate
schedule:
highstate:
function: state.highstate
minutes: 10
修改后可以启动 Minion,具体操作如下所示。
[root@minion ~]# systemctl start salt-minion
[root@minion ~]# systemctl enable salt-minion
Created
symlink
from
/etc/systemd/system/multi-user.target.wants/salt-minion.service
to
/usr/lib/systemd/system/salt-minion.service.
Minion 启动后,会自动生成公钥私钥,并将公钥发送到 Master 端。Minion 不监听
端口,全靠和 Master 保持长连接,可通过 netstat -an | grep ES 命令查看是否连接成功。
至此 SaltStack 安装完成。

3.SaltStack 使用

安装好 SaltStack 后,就可以在 Master 上面通过命令对 Minion 进行操作了。
(1)salt 实时批量操作,语法如下:
salt [选项] '<target>' <function> [arguments]
常用命令举例:
Master 端测试 Minion 是否连接正常。
salt '*' test.ping
上述命令中“*”为匹配所有主机,“test.ping”salt 一个函数。*号是正则,若分了多个组,
可以通过类似于 web*,来只匹配 web 服务器。
查看所有主机的磁盘信息,cmd.run 执行单个命令。
salt '*' cmd.run 'df -h'
把本地脚本拷贝到远程主机上执行。
salt '*' cmd.script salt://test.sh
salt '*' cmd.script salt://scripts/runme.sh 'arg1 arg2 arg3'
上述命令中,”cmd.script”表示执行一个脚本,即把本地脚本拷贝到远程主机上执行,
test.sh 要放在指定的文件存放路径,默认是/srv/salt/。脚本后面也可以跟参数执行,比如
arg1arg2arg3
向客户端推送 Master 端配置。
salt '*' state.highstate
查看所有主机的磁盘信息,并设置该命令执行的超时控制。
salt '*' cmd.run 'df -h' -t 5
(2)salt 分组管理,在配置文件/etc/salt/master 中加入如下内容:
vim /etc/salt/master
nodegroups:
group1: 'L@Server-11,Server-12'
group2: '@testmind'
//分组格式可在/etc/salt/master 中搜索 group,查看示例代码
salt -N web01group cmd.run 'hostname'
//分组执行
(3)salt-run 检查客户端 up 状态,具体操作如下所示。
salt-run manage.status
//查看所有客户端 up/down 状态
salt-run manage.up
//只显示 up 状态的客户端
salt-run manage.down
//只显示 down 状态的客户端
(4) salt-cp 批量拷贝文件,在 master 端执行,语法如下:
salt-cp [options] ‘<target>‘SOURCE DEST
示例代码如下:
salt-cp '*' /etc/hosts /etc/hosts
//Master 上的 hosts 文件分发到所有主机。
(5)SaltStack 定时同步
可以将 salt-call state.highstate 命令放在 Minion 端的定时任务中,来进行自动请求同
步。也可以将 salt ‘*‘ state.highstate 命令放在 Master 端的定时任务中,来进行自动推送到
所有机器。也可以在/etc/salt/minion 配置文件中加入如下内容,如下代码是每隔 10 分钟同
步。
schedule:
highstate:
function: state.highstate
seconds:600
(6)SaltStack 自动分发目录
指定同步的目录后,文件只需放到该目录下就会自动同步到 Minion 端,示例代码如下。
cat /srv/salt/top.sls
base:
"Server*":
- ssh_key.key
- zabbix.zabbix
//top.sls 文件中指定 Server 开头主机访问 zabbix.sls 文件里面定义的内容
[root@li salt]# cat /srv/salt/zabbix/zabbix.sls
/usr/local/zabbix/scripts:
//指定 Minion 端同步后生成的目录
file.recurse:
- source: salt://zabbix/zabbix_scripts
//指定要 Master 端同步的原始目录,以后只要把想要分发
的文件放在这个目录中,就会自动同步了
- dir_mode: 755
//dir_mode 设置目录的权限
- file_mode: 744
//file_mode 来设置文件的权限
(7)SaltStack 自动分发文件
当文件出现变更时,匹配 Server 开头的主机,同步文件到这些 Minion 上,并设置为对
应的文件权限,示例如下。
cat /srv/salt/top.sls
base:
"Server*":
- ssh_key.key
- zabbix.zabbix
cat /srv/salt/zabbix/zabbix.sls
/usr/local/zabbix/etc/zabbix_agentd.conf.d/UserParameter.conf:
//指定在 Minion 端生成的文件名
file.managed:
- source: salt://zabbix/UserParameter.conf //指定在 Master 同步的原始文件
- backup: minion
- mode: 744
- user: root
- group: root
//当文件发生变化时,都会把原文件备份,备份文件目录:/var/cache/salt/minion/
1.2 SaltStack 模块及应用
SaltStack 工具提供了非常多的功能模块,以便于对操作系统的基础功能和常用工具进
行操作。
1.2.1 SaltStack 常用模块
1.pkg 模块
pkg 模块的作用是包管理,包括增删更新。语法如下:
name: 包名称
(1)安装单个 httpd 包,示例代码如下。
httpd:
pkg.installed
//或者
lg_httpd:
pkg.installed
- name: httpd
(2)安装一系列软件包,示例代码如下。
mypkgs:
pkg.installed:
- pkgs:
- foo
- bar
- baz
(3)指定软件版本<, <=, >=, and >,示例代码如下:
mypkgs:
pkg.installed:
- pkgs:
- foo
- bar: 1.2.3-4
- baz
或者
mypkgs:
pkg.installed:
- pkgs:
- foo
- bar: '>=1.2.3-4'
- baz
(4)安装指定相关 rpm 包,示例代码如下:
mypkgs:
pkg.installed:
- sources:
- foo: salt://rpms/foo.rpm
- bar: http://somesite.org/bar.rpm
- baz: ftp://someothersite.org/baz.rpm
- qux: /minion/path/to/qux.rpm
(5)升级软件包到最新,示例代码如下:
mypkgs:
pkg.latest:
- pkgs:
- foo
- bar
- baz
(6)删除软件包,示例代码如下:
foo:
pkg.removed
(7)删除多个软件包,示例代码如下:
mypkgs_remove:
pkg.removed:
- pkgs:
- foo
- bar

2.file 模块

file 模块的作用是管理文件操作,包括同步文件,设置文件权限,所属用户组,删除文
件等操作。file 模块的参数如下所示:
(1)file.managed:文件管理:
name:要同步到 Minion 上的文件路径+文件名;
source:同步文件源为 Master 上的文件;
backup 参数:备份作用,如果有改动才会备份;
backup.bak 会在 Minion 上该文件的同级目录下加.bak 备份;
backupminion,会备份到 Minion 下的/var/cache/salt/minion/backup_files
下。
mode:权限设置,例如 644
owner:所属设置;
group:所属组设置。
(2)file.append:向文件中添加内容:
text:向文件中添加内容信息;
(3)file.comment:文件注释操作:
char:设置注释使用的字符,默认是#
regex:需要跟文件中每一行中信息匹配的正则表达式。
(4)file.copy:把 Minion 本地文件复制到某个目录下:
sourceMinion 本地文件;
makedirs:如果复制的目标目录不存在是否要创建;
force:如果复制目标文件和源文件是相同的文件名,是否覆盖;
(5)file.directory:目录创建:
user:对新创建文件夹设置所属用户;
group:对新创建文件夹设置所属组;
dir_mode:对新创建文件夹设置访问权限;
file_mode:对新创建文件夹下文件设置权限;
recurse:递归接受以上设置,用户组等等;
makedirs:强制建立文件夹 = mkdir -p
以上参数只有对新建的文件夹设置相应的属性,原来存在属性都不变更。
(6)file.exists:判断文件是否存在;
(7)file.absent:删除文件;
(8)file.symlink:建立 link 链接参数详解:
name:源文件;
target:目标文件;
force:是否强制创建。
(9)file.touch:创建空文件,或者修改文件三个时间;
name:文件名;
atime:访问时间;
mtime:修改时间;
makedirs:如果目录不存在,是否创建目录。
下面演示几个 file 模块的使用方法:
(1)YUM 安装源配置文件同步,示例代码如下。
yum:
file.managed:
- name: /etc/repo.d/centos-base.repo
- source: salt://files/centos-base.repo
- mode: 644
- owner: root
- group: root
(2)同步之前备份文件,示例代码如下。
/tmp/c.log:
file.managed:
- source:
- salt://a.log
- backup: .bak
或者
/tmp/dd.log:
file.managed:
- source:
- salt://a.log
- backup: minion
(3)向 Minion 的文件中追加内容,示例代码如下。
/tmp/d.log:
file.append:
- text: |
Thou hadst better eat salt with the Philosophers of Greece,
than sugar with the Courtiers of Italy.
- Benjamin Franklin
或者:
/tmp/e.log:
file.append:
- text:
- Trust no one unless you have eaten much salt with him.
- "Salt is born of the purest of parents: the sun and the sea."
或者
#a.log b.log append /tmp/bb.log
/tmp/bb.log:
file:
- append
- sources:
- salt://a.log
- salt://b.log
(4)添加注释 ,默认添加#,示例代码如下。
/tmp/a.log:
file.comment:
- regex: ^s
(5)把本地的文件拷贝到其他的目录中,示例代码如下。
/tmp/abc/a.log:
file.copy:
- source: /tmp/b.log
- makedirs: True
- force: True
(6)创建目录,并作相应设置,示例代码如下
/tmp/aaa/bbb/ddd/fff:
file.directory:
- user: root
- group: root
- dir_mode: 755
- file_mode: 644
- makedirs: True
- recurse:
- user
- group
- mode
(7)判断文件是否存在,示例代码如下。
/tmp/a.log:
file.exists
(8)设置链接,示例代码如下。
/tmp/aaa.log:
file.symlink:
- target: /tmp/alink.log
- force: True
#创建一个空文件
/tmp/bbb.log:
file.touch
#删除文件:
/tmp/ccc.log:
file.absent
#使用 red 替换文件中字符串
/tmp/red.log:
file.red:
- before: 'blue'
- after: 'black'
- limit: 's'
#高级运用使用模板
/tmp/template_test.conf:
file.managed:
- source: salt://template_test.conf
- mode: 644
- owner: root
- group: root
- template: jinja
template_test.conf 文件中的内容--------------->
{% if grains['os'] == 'RedHat' %}
host: {{ grains['host'] }}
{% elif grains['os'] == 'CentOS' %}
host: {{ grains['fqdn'] }}
{% endif %}

3.cmd 模块

cmd 模块的作用是在 Minion 上执行命令或者脚本,参数如下所示。
(1)cmd.run 参数
name:执行脚本或者命令的名字;
onlyif:测试命令,如果执行测试命令返回 truecmd.run 的命令才有可能执行;
unless:与 onlyif 相反,如果执行后为 falsecmd.run 的命令才有可能执行;
cwd:执行命令当前目录设置,默认为/root
user:执行命令的用户,默认 root
group:执行命令的组,默认 root
shell:执行命令使用的 Shell
env:执行命令的环境设置;
umask:运行命令时候 umask 设置;
output_loglevel:执行命令日志输出级别,其中特殊的设置是 quiet,不输出日志;
timeout:执行命令的超时时间,如果超时就发送 kill -l SIGTERM 命令,如果"kill -l
SIGTERM"被忽略了,那么紧接着发送 kill 命令。
(2)cmd.wait 参数
cmd.run 中的参数相比,只是 wait 中没有 timeout 参数,其他参数意义一样。cmd.run
cmd.wait 的区别是:多个判断条件时候,只要有一个条件满足就会执行 cmd.run,只有
所有的条件都满足才会执行 cmd.wait
下面演示 cmd 模块的使用方法:
(1)在/tmp 目录下,使用 nobody 用户执行脚本/tmp/testscript,示例代码如下。
Run testscript:
cmd.run:
- name: /tmp/testscript
- cwd: /
- user: nobody
- mode
(2)判断 httpd 配置文件是否改动,如果改动,执行同步,然后测试配置文件是否可用,
如果可用,重新加载配置文件,示例代码如下
"/etc/httpd/conf/httpd.conf":
file.managed:
- source: salt://httpd/conf/httpd.conf
reloadhttpd:
cmd.wait:
- name: "/etc/init.d/httpd graceful"
- onlyif: "/etc/init.d/httpd configtest"
- watch:
- file: /etc/httpd/conf/httpd.conf
需要注意的是:"/etc/httpd/conf/httpd.conf" 配置文件这块,最好使用引号,因为有时
候可能会含有特殊字符。
4.user 模块
user 模块的作用是管理系统账户操作,参数如下所示:
(1)user.present 参数中 uid、gid、home 等选项没有设置是系统默认设置,参数详解:
name:要创建的用户名;
uid:设置 uid
gid:设置默认的组 gid
groups:设置用户所属组;
home:用户的自定义登录目录;
password:为用户设置密码;
enforce_password:如果密码已设置且密码哈希值与“password”字段中设置的密
码不同,则设置为 False 以防止密码被更改。如果未设置“password”,则忽略此选
项,默认为 True
shell:设置用户的登录后的 Shell,默认将设置为系统默 Shell
(2)user.absent 用于删除用户参数详解
name: 设置需要删除的用户名;
purge: 是否删除用户家目录;
force: 如果用户当前已登录,则 absent state 会失败。选项为 True 时,就算用户
当前处于登录状态也会删除本用户。
User 模块的使用方法如下所示:
1)创建用户 aaa 并设置密码、shell、home 目录、uid、gid、其他所属组,示例代码
如下。
laoseng:
user.present:
- password: '7D2dlkjDoOO988DFDS'
- shell: /bin/bash
- home: /home/aaa
- uid: 888
- gid: 888
- groups:
- wheel
- storage
(2)创建用户 laoseng,示例代码如下
laoseng:
user.absent

5.service 模块

service 模块的作用是管理系统服务操作,包括 startstopreloadrestart,参数如
下所示:
name:服务名称;
enable:设置自启动 True,默认不设置;
watch:监控一些条件,如果成立默认执行 restart
reload:默认为 False,如果设置为 True 时候,当 watch 条件成立,则会 reload
不会 restart
service 模块的使用方法:Apache 服务管理。示例代码如下:
httpd:
service:
- running
- enable: True
- reload: True
- watch:
- pkg: httpd

6.cron 模块

cron 模块作用管理 cron 服务操作,参数如下所示:
cron.present 添加 cron 任务,参数:
name:资源名字;
user:默认 root,或者指定用户执行;
minutehourdaymonthmonthdayweek:参数默认是*
cron.absent:删除 cron 任务。
cron 模块使用方法如下所示。
(1)添加 cron 任务,示例代码如下:
/path/to/cron/script:
cron.present:
- user: root
- minute: random
- hour: 2
- daymonth: '*'
- month: '*/2'
- dayweek: 4
- comment: "this script is rsync pic"
或者
rsync_pic:
cron.present:
- name: "/bin/sh /tmp/script.sh >/dev/null 2>&1"
- comment: "this script.sh is rsync log"
- user: root
- minute: random
- hour: 2
- month: '*/2'
- dayweek: 4
- pkg: httpd
(2)删除 cron 任务,示例代码如下
/path/to/cron/script:
cron.absent

7.hosts 模块

hosts 模块的作用是管理/etc/hosts 文件,参数如下所示。
(1)host.present 添加域名,参数:
name:域名;
names:多个域名;
ipip 地址。
(2)host.absent 删除域名
hosts 模块使用方法如下所示:
(1)添加单个 ip 与单个域名对应,示例代码如下:
host2:
host.present:
- ip: 192.168.1.12
- name:
- 2.bbb.com
(2)添加单个 ip 与多域名对应,示例代码如下:
host1:
host.present:
- ip: 192.168.1.12
- names:
- 2.bbb.com
- test.test.com
(3)删除 ip 对应的域名,示例代码如下:
host3:
host.absent:
- ip: 192.168.1.12
- name: 2.bbb.com

1.2.2 综合应用案例

案例需求:
使用 YUM 安装 Apache 服务;
设置 Apache 用户和组;
设置同步配置文件,并启动服务。
案例实现:
所需模块:pkg 模块、user 模块、组模块、service 模块、配置文件模块。
建立模块之间的关系:安装模块-->建立用户和组-->设置 httpd 目录-->同步配置文
-->启动服务。
示例代码如下。
apache:
pkg:
- installed
service:
- running
- watch:
- pkg: apache
- file: /etc/httpd/conf/httpd.conf
- user: apache
user.present:
- uid: 87
- gid: 87
- home: /var/www/html
- shell: /bin/nologin
- require:
- group: apache
group.present:
- gid: 87
- require:
- pkg: apache
/etc/httpd/conf/httpd.conf:
file.managed:
- source: salt://apache/httpd.conf
- user: root
- group: root
- mode: 644

1.3 SaltStack 批量部署并配置 Nginx

1.3.1 案例环境

在生产环境中,经常需要根据不同的业务需求来分组部署和配置 Nginx 服务器。本案
例使用三台服务器,均采用 CentOS 7.3 系统,要求能上互联网,Selinux 和防火墙均已关
闭。
需要注意的是,三台服务器一定要设置完整的 fqdn,和域名一样的形式,不然在主控
端执行远程操作或者配置的时候等待时间会非常长,甚至还会出现其它不可控的问题。服务
器具体参数配置如表 1-2 所示。
1-2 服务器参数
角色主机名IP 地址组名cpu 个数Nginx 根目录
mastermaster.saltstack.com192.168.9.233
minionweb01.saltstack.com192.168.9.234web01group1/data
minionweb02.saltstack.com192.168.9.235web02group2/www

实验网络拓扑如图 1.1 所示。

1.1 网络拓扑

1.3.2 操作步骤

1. SaltStack 安装

下面演示部署服务器的具体步骤。
1)在三台服务器增加主机名和 IP 的映射关系,修改/etc/hosts 文件,增加如下内容。
生产环境建议使用 DNS 服务器统一做解析管理。
[root@localhost ~]# hostnamectl set-hostname master.saltstack.com
[root@localhost ~]# bash
[root@master ~]#
[root@localhost ~]# hostnamectl set-hostname web01.saltstack.com
[root@localhost ~]# bash
[root@web01 ~]#
[root@localhost ~]# hostnamectl set-hostname web02.saltstack.com
[root@localhost ~]# bash
[root@web02 ~]#
[root@master ~]# cat << EOF >> /etc/hosts
192.168.9.233 master.saltstack.com
192.168.9.234 web01.saltstack.com
192.168.9.235 web02.saltstack.com
EOF
//三台服务器上均操作
(2)因为后面需要安装 SaltStack 服务端、SaltStack 客户端与 Nginx 服务,所以在三
台服务器上都需要安装 EPEL 源。下面以主控端 Master 为例进行介绍。
[root@master ~]# yum install -y epel-release
主控端(也就是 Master)上安装 SaltStack 软件。[root@master ~]# yum install -y salt-master
被控端(也就是两台 Minion)上安装 SaltStack 软件。
[root@web1 ~]# yum install -y salt-minion
[root@web2 ~]# yum install -y salt-minion
(3)配置主控端配置文件/etc/salt/master,默认的 master 文件全部是注释的。首先需
要修改主控端配置文件中的监听地址。需要注意的是为了安全,监听的地址一定要写私网地
址。
interface: 192.168.9.233
设置允许被控端自动认证,只要被控端设置完主控端的 IP 地址后启动服务,主控端就
会允许被控端自动认证,以避免以后每次运行 salt-key 来确认证书信任。
auto_accept: True
修改 SaltStack 文件根目录位置,去掉注释。
file_roots:
base:
- /srv/salt/
修改组分类。
nodegroups:
web01group: 'web01.saltstack.com'
web02group: 'web02.saltstack.com'
开启 pillar 功能。
pillar_opts: True
设置 pillar 的主目录,去掉注释。
pillar_roots:
base:
- /srv/pillar
主控端主要修改内容包括:
[root@master ~]# cat /etc/salt/master | grep -v "^$" | grep -v "^#"
interface: 192.168.9.233
auto_accept: True
file_roots:
base:
- /srv/salt
pillar_roots:
base:
- /srv/pillar
pillar_opts: True
nodegroups:
web01group: 'web01.saltstack.com'
web02group: 'web02.saltstack.com'
主控端做完上述操作后启动 salt-master 服务。
[root@master ~]# systemctl start salt-master
[root@master ~]# systemctl enable salt-master
Created
symlink
from
/etc/systemd/system/multi-user.target.wants/salt-master.service
to
/usr/lib/systemd/system/salt-master.service.
启动完后监听 TCP 4505TCP 4506 端口。生产环境中,如果启用防火墙,建议主控
端开放这两个端口。
创建 salt 文件根目录及 pillar 目录。
[root@master ~]# mkdir /srv/salt
[root@master ~]# mkdir /srv/pillar
(4)配置两台被控端的配置文件/etc/salt/minion。
注意:默认的 minion 文件也是全部注释的。
master: 192.168.9.233
//设置主控端 IP
id: web01.saltstack.com
//设置被控主机名,另一台是 web02.saltstack.com
分别启动两台被控端服务。
[root@web01 ~]# systemctl start salt-minion
[root@web01 ~]# systemctl enable salt-minion
Created
symlink
from
/etc/systemd/system/multi-user.target.wants/salt-minion.service
to
/usr/lib/systemd/system/salt-minion.service.
[root@web02 ~]# systemctl start salt-minion
[root@web02 ~]# systemctl enable salt-minion
Created
symlink
from
/etc/systemd/system/multi-user.target.wants/salt-minion.service
to
/usr/lib/systemd/system/salt-minion.service.
在主控端上,简单测试主控端和被控端的通信状态。如果返回都是 True,说明正常。
注意:
这里的 ping 和我们平时用的 ping 命令不同。它只是 test 类下面的一个方法,是验证主
控端和被控端的通信状态。
*表示所有通过认证的被控端。还可以支持其它很多正则表达式的匹配。
[root@master ~]# salt '*' test.ping
web01.saltstack.com:
True
web02.saltstack.com:
True
2. SaltStack 批量部署 Nginx
下面利用 SaltStack 的三个重要组件 grainspillar state 完成 Nginx 的安装配置工作。grains pillar 的作用都是采集被控端数据的。其中 grains 的特性是每次启动汇报;而 pillar
是随时可变的,只要在 master 端修改了,一般都会立刻生效的。所以,grains 更适合做一
些静态的属性值的采集,例如设备的角色、磁盘个数等诸如非常固定的属性。如果想定义的
属性值是经常变化的,就采用 pillar。如果想定义的属性值是很固定、不易变的,就采用 grains
在配置之前,需要分析 Nginx 的主配置文件,要根据当前 CPU 个数设置一些值、设置
一些打开文件句柄数等等。
定义 grains 数据的方法有两种:一种为在被控主机定制配置文件,另外一种是通过主
控端扩展模块 API 实现,区别是模块更灵活。下面用自定义的方式进行。
通过下面的命令可以查看被控机 web01 主机的 grains 所有值。
[root@master ~]# salt 'web01.saltstack.com' grains.items
web01.saltstack.com:
----------
SSDs:
biosreleasedate:
07/02/2015
biosversion:
6.00
cpu_flags:
- fpu
- vme
- de
- pse
- tsc
- msr
- pae
- mce
- cx8
- apic
- sep
- mtrr
- pge
- mca
//省略内容
grains SaltStack 重要的组件之一,它可以收集被控主机的基本信息,如 CPU、内
核、操作系统、虚拟化等静态数据。但是有些数据采集不到,例如默认打开的文件句柄数,
需要通过自定义的 Python 脚本获取。在服务端利用这些信息对不同被控主机进行个性化配
置。
首先,创建 grains 目录,需要将目录下的定制文件同步到被控机上运行;然后,能正
常获取被控机打开文件句柄数。
[root@master ~]# mkdir /srv/salt/_grains
[root@master ~]# vim /srv/salt/_grains/nginx_config.py
#!/usr/bin/python
import os,sys,commands
def NginxGrains():
'''
return Nginx config grains value
'''
grains = {}
max_open_file=65535
try:
getulimit = commands.getstatusoutput('source /etc/profile;ulimit -n')
except Exception,e:
pass
if getulimit[0]==0:
max_open_file = int(getulimit[1])
grains['max_open_file'] = max_open_file
return grains
上述脚本的含义就是让被控机获取它当前打开文件句柄数。
在 同 步 到 被 控 端 之 前 , 执 行 如 下 命 令 , 确 认 在 主 控 端 是 否 能 获 取 被 控 端 的
max_open_file 值。
[root@master ~]# salt '*' grains.item max_open_file
web02.saltstack.com:
----------
max_open_file:
web01.saltstack.com:
----------
max_open_file:
从命令执行结果中得知:不能获取到 max_open_file 的值,需要同步 grains 模块,在
主控端运行如下命令。
[root@master ~]# salt '*' saltutil.sync_all
web02.saltstack.com:
----------
beacons:
grains:
- grains.nginx_config
modules:
output:
renderers:
returners:
sdb:
states:
utils:
web01.saltstack.com:
----------
beacons:
grains:
- grains.nginx_config
modules:
output:
renderers:
returners:
sdb:
states:
utils:
被控端文件存放在/var/cache/salt 目录下。
[root@web01 ~]# find /var/cache/salt/
/var/cache/salt/
/var/cache/salt/minion
/var/cache/salt/minion/extmods
/var/cache/salt/minion/extmods/grains
/var/cache/salt/minion/extmods/grains/nginx_config.py
/var/cache/salt/minion/extmods/grains/nginx_config.pyc
/var/cache/salt/minion/proc
/var/cache/salt/minion/module_refresh
/var/cache/salt/minion/files
/var/cache/salt/minion/files/base
/var/cache/salt/minion/files/base/_grains
/var/cache/salt/minion/files/base/_grains/nginx_config.py
再次获取 max_open_file 的值。
[root@master ~]# salt '*' grains.item max_open_file
web02.saltstack.com:
----------
max_open_file:
1024
web01.saltstack.com:
----------
max_open_file:
1024
配置 pilllar:在主控端上创建入口文件 top.sls,入口文件的作用是定义 pillar 的数据覆
盖被控主机的有效域范围。具体内容如下:
[root@master ~]# vim /srv/pillar/top.sls
base:
web01group:
//组名
- match: nodegroup
- web01server
//设置包括 web01server.sls
web02group:
//组名
- match: nodegroup
- web02server
//设置包括 web02server.sls
“web01group””web02group”/etc/salt/master 中定义的不同的组,对每一个组编写
一个对应的文件指定配置,这里使用的是“web01server””web02server”,再分别定义不同
组主机的 Nginx 的根目录,如下所示:
[root@master ~]# vim /srv/pillar/web01server.sls
nginx:
root: /data
[root@master ~]# vim /srv/pillar/web02server.sls
nginx:
root: /www
使用以下命令查看 pillar 配置的情况。
[root@master ~]# salt '*' pillar.data nginx
web01.saltstack.com:
----------
nginx:
----------
root:
/data
web02.saltstack.com:
----------
nginx:
----------
root:
/www
在执行结果中可以很明显的看出,被控主机的 Nginx 的根目录被配置成功。
定义 state 的入口 top.sls 文件,注意和 pillar 的入口文件名字一样,内容如下。
[root@master ~]# vim /srv/salt/top.sls
base:
'*':
- nginx
其次,定义被控机执行的状态,安装 Nginx 软件、配置、启动。
[root@master ~]# vim /srv/salt/nginx.sls
nginx:
pkg:
//1.包管理
- installed
//安装包
file.managed:
//
2.文件管理
- source: salt://nginx/nginx.conf
//配置文件在服务器路径
- name: /etc/nginx/nginx.conf
//配置文件在被控主机的路径
- user: root
//nginx 用户名
- group: root
//用户所在组
- mode: 644
//权限
- template: jinja
//配置文件使用 jinja 模板
service.running:
//3.运行服务管理
- enable: True
//开机自动运行
- reload: True
//可以重载
- watch:
- file: /etc/nginx/nginx.conf
- pkg: nginx
其中:
salt://nginx/nginx.conf 为配置模板文件位置;
enable:True 表示检查服务是否在开机自启动服务队列中,如果不在则加上,等价
chkconfig nginx on 命令;
reload:True 表示服务支持 reload 操作,不加则会默认执行 restart 操作;
watch 即用于检测/etc/nginx/nginx.conf 是否发生变化,又用于确保 Nginx 已安装
成功。
上面的配置文件实际上与在一台服务器直接安装 Nginx 的过程是相同的,首先是安装
包,然后是对配置文件进行修改,最后是启动服务。
使用 jinja 模板定义 Nginx 配置文件 nginx.conf,首先创建一个 nginx 目录,因为上面定
义了 Nginx 配置文件的源路径。
[root@master ~]# mkdir /srv/salt/nginx
然后在该路径下创建 Nginx 配置文件,nginx.conf 配置文件可以根据自己的需求进行编
写。
[root@master ~]# vim /srv/salt/nginx/nginx.conf
user nginx;
worker_processes {{grains['num_cpus']}};
{% if grains['num_cpus'] ==1 %}
worker_cpu_affinity 10;
{% elif grains['num_cpus'] ==2 %}
worker_cpu_affinity 01 10;
{% elif grains['num_cpus'] == 4 %}
worker_cpu_affinity 0001 0010 0100 1000;
{% elif grains['num_cpus'] == 8 %}
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000
10000000;
{% else %}
worker_cpu_affinity 0001 0010 0100 1000;
{% endif %}
worker_rlimit_nofile {{ grains['max_open_file'] }};
error_log /var/log/nginx_error.log;
pid
/var/run/nginx.pid;
events
{
worker_connections {{ grains['max_open_file'] }};
}
http
{
include
/etc/nginx/mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 60;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"' ;
server{
listen 80 default_server;
server_name _;
location / {
root {{ pillar['nginx']['root'] }};
index index.html index.htm;
}
error_page 404
/404.html;
location = /404.html {
root /usr/share/nginx/html;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
}
现在就可以在主控端执行刷新 state 配置,让两台被控端执行安装 Nginx 并配置。
[root@master ~]# salt '*' state.highstate
web01.saltstack.com:----------
ID: nginx
Function: pkg.installed
Result: True
Comment: The following packages were installed/updated: nginx
Started: 12:50:33.539350
Duration: 33590.857 ms
Changes:
//省略部分......
----------
ID: nginx
Function: file.managed
Name: /etc/nginx/nginx.conf
Result: True
Comment: File /etc/nginx/nginx.conf updated
Started: 12:51:07.133783
Duration: 42.468 ms
Changes:
//省略部分......
----------
ID: nginx
Function: service.running
Result: True
Comment: Service nginx has been enabled, and is running
Started: 12:51:07.205801
Duration: 992.623 ms
Changes:
----------
nginx:
True
Summary
------------
Succeeded: 3 (changed=3)
Failed:
0
------------
Total states run:
3
通过执行结果,看到了三个 ID,相当于三个任务,第一个安装,第二个配置,第三个
启动。而且显示三个都成功了,失败数是零个。如果不放心,也可以看看被控端 Nginx
否启动。
[root@web01 ~]# ps -ef | grep nginx
root
2737
1 0 14:35 ?
00:00:00 nginx: master process /usr/sbin/nginx
nginx
2738 2737 0 14:35 ?
00:00:00 nginx: worker process
root
2770 2365 0 14:35 pts/0
00:00:00 grep --color=auto nginx
查看 web01.saltstack.com 节点的 Nginx 主配置文件 nginx.conf
[root@web01 ~]# more /etc/nginx/nginx.conf
user nginx;
worker_processes 1;
//根据 cpu 个数配置
worker_cpu_affinity 10;
worker_rlimit_nofile 1024;
//根据定义的 max_open_file 定义
error_log /var/log/nginx_error.log;
pid
/var/run/nginx.pid;
events
{
worker_connections 1024;
//根据定义的 max_open_file 定义
}
......
//省略内容
location / {
root /data;
//定义的 Nginx 目录
index index.html index.htm;
}
//省略内容
查看 web02.saltstack.com 节点的 Nginx 主配置文件 nginx.conf,上面注释的内容有相
应的变化。这样,基本完成了通过 SaltStack 批量部署 Nginx 并配置。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2103321.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

009.数据库管理-数据字典动态性能视图

我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448; 入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448; 虚 拟 环 境 搭 建 &#xff1a;&#x1f449;&…

唯众发布职业院校信创实训室解决方案 助力职教数字化高质量发展

在数字化转型的大潮中&#xff0c;教育行业正迎来前所未有的变革机遇。为了积极响应国家关于自主可控、信息技术应用创新&#xff08;信创&#xff09;的战略部署&#xff0c;唯众近日发布了专为职业院校量身定制的信创实训室解决方案&#xff0c;旨在通过先进的技术平台和丰富…

摄影竞赛系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;教师管理&#xff0c;学生管理&#xff0c;辅导员管理&#xff0c;项目信息管理&#xff0c;作品信息管理&#xff0c;留言板管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#…

代码随想录刷题day21丨669. 修剪二叉搜索树,108.将有序数组转换为二叉搜索树,538.把二叉搜索树转换为累加树,二叉树总结

代码随想录刷题day21丨669. 修剪二叉搜索树&#xff0c;108.将有序数组转换为二叉搜索树&#xff0c;538.把二叉搜索树转换为累加树&#xff0c;二叉树总结 1.题目 1.1修剪二叉搜索树 题目链接&#xff1a;669. 修剪二叉搜索树 - 力扣&#xff08;LeetCode&#xff09; 视频…

bootstrap下拉多选框

1、引用(引用资源下载) <!-- Latest compiled and minified CSS --> <link rel"stylesheet" href"static/css/bootstrap-select.min.css"> <!-- Latest compiled and minified JavaScript --> <script src"static/js/bootstrap…

golang-开发工具及package

1. 开发工具 工欲善其事&#xff0c;必先利其器&#xff0c;我选择vscode&#xff0c;其它的工具比如goland也不错 下载地址&#xff1a;Download Visual Studio Code - Mac, Linux, Windows 我的环境是是debian linux&#xff0c;所以我下载deb包&#xff0c;下载完成后&am…

CTFHub技能树-备份文件下载-vim缓存

目录 方法一&#xff1a;直接浏览器访问 方法二&#xff1a;使用kali恢复vim缓存文件 方法三&#xff1a;直接使用curl访问 最后同样备份文件系列的都可用dirsearch扫描 当开发人员在线上环境中使用 vim 编辑器&#xff0c;在使用过程中会留下 vim 编辑器缓存&#xff0c;当…

江科大/江协科技 STM32学习笔记P30

文章目录 一、FlyMcu串口下载1、串口下载的流程2、串口烧录的选项字节区 二、STLINK Utility 一、FlyMcu串口下载 1、串口下载的流程 例如机器人给自己换电池&#xff0c;需要拆掉旧电池再装上新电池&#xff0c;为了实现这个步骤需要再做一个小机器人&#xff0c;需要换电池时…

WinCC Modbus TCP 通信

概述 从版本WinCC V7.0 开始&#xff0c;WinCC支持Modbus TCP通讯&#xff0c;WinCC中的Modbus TCP驱动主要是针对施耐德PLC开发的&#xff0c;支持的PLC类型如下&#xff1a; 图1 本文档以Quantum CPU651和 Premium P57为例&#xff0c;介绍WinCC V7.2 的Modbus TCP通讯的组…

随手记:小程序体积超出2M包大小如何优化

小程序的包体积限制是2M&#xff0c;超出包大小如何优化 先简单列出&#xff0c;最近比较忙&#xff0c;后续优化明细&#xff0c;有着急的先留言踢我 1.分包 留几个主要的页面体积小的&#xff0c;剩下的在page.json中拆到subpackages中&#xff0c;简单举个例子 "page…

总结一下windows电脑字体模糊的优化方案

问题&#xff1a;谷歌浏览器上页面显示的字体非常细&#xff0c;有点费眼睛了&#x1f47e; 解决方案&#xff1a; 方案1&#xff1a;手动调整ClearType文本。方案2&#xff1a;英伟达显卡控制面板->管理3d设置->关闭全局平滑FXAA&#xff08;如果某个软件需要使用平滑处…

《‌黑神话:‌悟空》‌游戏攻略‌

时光荏苒&#xff0c;岁月如梭&#xff0c;不知不觉已经来到了2024年的9月份了。 ‌突然想写一篇关于《‌黑神话&#xff1a;‌悟空》‌的游戏攻略‌。 在《‌黑神话&#xff1a;‌悟空》‌这款以中国古代名著《‌西游记》‌为背景的动作角色扮演游戏中&#xff0c;‌玩家将扮…

J.U.C Review - 阻塞队列原理/源码分析

文章目录 阻塞队列的由来BlockingQueue的操作方法BlockingQueue的实现类ArrayBlockingQueueLinkedBlockingQueueDelayQueuePriorityBlockingQueueSynchronousQueue 阻塞队列原理深入分析1. 构造器和监视器初始化2. put操作的实现3. take操作的实现4. 注意事项小结 线程池中的阻…

泰克THDP0100(Tektronix)thdp0100高压差分探头详情资料

泰克 THDP0100 高压差分探头具有较大的差分动态范围功能&#xff0c;为用户提供了安全的高压测量探头解决方案。每个探头都配有两种尺寸的钩尖&#xff0c;并具有超范围视觉和声音指示器&#xff0c;当用户超出探头的线性范围时会发出警告。泰克 THDP0100 探头配备 TEkVPI 接口…

【vue css】css字体设置渐变色

实现的效果&#xff1a; 添加的代码&#xff1a; h2 {background-image: -webkit-linear-gradient(bottom, #1bffff, #ffffff);background-clip: text;//背景被裁剪成文字的前景色。-webkit-text-fill-color: transparent;//指定了文本字符的填充颜色。若未设置此属性&#xf…

【Linux操作系统】:Linux生产者消费者模型

目录 生产者消费者模型的概念 生产者消费者模型的特点 生产者消费者模型优点 基于BlockingQueue的生产者消费者模型 基于 BlockingQueue 的生产者消费者模型的概念 模拟实现基于阻塞队列的生产消费模型 生产者消费者模型的概念 生产者消费者模式就是通过一个容器来解决生…

MySQL Email验证流程详解:从注册到激活!

MySQL Email通知系统搭建教程&#xff01;如何从MySQL发送邮件&#xff1f; MySQL Email验证是一个至关重要的环节&#xff0c;它确保了用户注册过程的安全性和有效性。AokSend将详细介绍从用户注册到MySQL Email激活的完整流程&#xff0c;帮助开发者更好地理解和实现这一功能…

东风汽车将出席第五届中国新能源汽车热管理创新国际峰会

2024第五届中国新能源汽车热管理创新国际峰会将于11月14-15日在上海召开。峰会将汇聚来自全球的行业专家、学者、企业领袖及技术精英&#xff0c;共同探讨新能源汽车热管理领域的最新技术成果和发展趋势。 本次峰会将涵盖整车热管理系统构建、新能源商用车热管理、智能热管理系…

Python OpenCV 影像处理:傅立叶转换

►前言 上篇介绍基于计算影像的梯度&#xff0c;通过在影像中找到梯度值的变化来识别边缘。 本篇将介绍傅立叶变换的基本原理&#xff0c;了解傅立叶变换是如何将影像从空间域转换到频率域的&#xff0c;以及为什么这种转换在影像处理过程中是有用的。以及傅立叶变换的实际应…

9.3 k8s介绍

⼀、编排分类 单机容器编排: docker-compose 容器集群编排: docker swarm、mesosmarathon、kubernetes 应⽤编排: ansible(模块&#xff0c;剧本&#xff0c;⻆⾊) ⼆、系统管理进化史 1. 传统部署时代 早期&#xff0c;各个组织是在物理服务器上运⾏应⽤程序。 由于⽆法限…