ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Salt State Modules 完全参考指南:132 个内置状态模块的目录、用法与编写原理

Salt State Modules 完全参考指南:132 个内置状态模块的目录、用法与编写原理 运维配置管理后端【免费下载链接】saltSoftware to automate the management and configuration of infrastructure and applications at scale.项目地址https://gitcode.com/gh_mirrors/sa/salt点击查看免费下载导读本文以 Salt 官方文档的 State System Reference 与 State Modules 编写指南 为主线结合本仓库salt/states/目录下 132 个内置 state 模块的真实源码系统讲解 Salt 状态系统的核心机制SLS 数据如何映射到 state 模块、内置模块的完整全景清单与适用领域、状态函数的返回值契约含 test 模式三态语义以及如何编写、分发自定义 state 模块。读完本文你将具备查阅 全量模块 API 文档入口、正确选用状态模块并独立编写可维护的自定义状态的实战能力。一、State 系统与 State 模块的定位Salt 提供了一套用于管理 minion 配置或状态的接口管理员从中央 master 定义目标主机应处的状态随后统一强制执行。官方文档将其称为 State Management也被称为 Software Configuration ManagementSCM——安装软件包、启动或重启服务、放置配置文件并监听其变化都只是让系统进入预定状态这一目标的具体体现见 State System Reference 开篇。这套机制由几个相互配合的组件构成SLS 系统Salt State 文件系统以数据文件描述 minion 应如何被配置文件按目录树布局默认用 Jinja 模板渲染 YAML 编写Renderer渲染器把 SLS 渲染成 Salt 内部统一的 highstate 数据结构Salt 本身不关心数据从哪种模板语言而来详见 Configuration Management 概览State Modules状态模块真正执行强制逻辑、把 SLS 数据兑现为系统变更的组件即本文主题。State 模块与执行模块Execution Module不同执行模块是一次性调用而状态模块描述并强制一个目标状态。状态只在被目标匹配到的 minion 上编译执行如果需要在 master 侧直接执行函数应使用 runner见 State System Reference 中的相关说明。二、SLS 数据到 State 模块的映射机制2.1 一个直观的映射示例State 模块的设计目标就是易写、直观SLS 数据结构中的每一项直接映射到模块函数及其参数。官方 State Modules 编写指南 用下面这段配置说明了完整映射关系/etc/salt/master: # 映射为 name除非下面显式给出 name 参数 file.managed: # 映射为 模块名.函数名即 salt/states/file.py 中的 managed() - user: root # 传递给 managed() 的众多参数之一 - group: root - mode: 644 - source: salt://salt/master也就是说ID: module.function中的module对应salt/states/module.py文件function对应该文件内的同名 Python 函数后续的- key: value列表则全部作为关键字参数传入函数。这也意味着 state 模块内的函数名、参数名必须高度可读因为它们直接构成了用户接口。2.2 一个可运行的完整状态State System Reference 给出了如下典型状态文件它同时演示了pkg、service、file三类模块以及require/watch两个关键 requisitevim: pkg.installed: [] salt: pkg.latest: - name: salt service.running: - names: - salt-master - salt-minion - require: - pkg: salt - watch: - file: /etc/salt/minion /etc/salt/minion: file.managed: - source: salt://salt/minion - user: root - group: root - mode: 644 - require: - pkg: salt这段配置会保证vim 已安装salt 已安装且为最新salt-master 与 salt-minion 守护进程处于运行状态minion 配置文件就位。同时require保证部署顺序先装包、再放配置watch保证被监视的配置文件一旦更新服务会被重启。状态的执行顺序与依赖关系可进一步参考 Ordering 与 Requisites。2.3 top.sls 与目标匹配状态文件通过top.sls映射到具体 minionbase: *: - salt - users - users.admin saltmaster.*: - match: pcre - salt.mastertop 文件顶层是环境如内置的base每个环境内是目标表达式最后是应用到匹配 minion 的状态列表。注意自 2014.7.0 起未显式指定时默认使用 compound 匹配器它会按单词解析表达式因此包含空格的 minion ID 需要显式指定match: glob等其它匹配类型完整匹配类型表见 Top 文件文档。三、132 个内置 State 模块全景清单本文关联文档 doc/ref/states/all/index.rst 是官方 API 文档的总入口它以autosummary列出全部内置 state 模块每个模块对应一个独立的salt.states.name.rstAPI 页例如 salt.states.file.rst 通过automodule自动生成函数级文档。该清单在仓库中与 salt/states/ 目录下的 132 个 Python 文件一一对应。下面按领域分组完整罗列并给出每个模块的核心用途便于按需跳转查阅。3.1 核心文件与命令模块用途cmd执行命令并校验其退出码与输出是最通用的命令状态file文件/目录/链接/内容管理提供managed、directory、absent、append、comment、replace等函数archive下载并解压归档文件到指定目录git克隆、拉取仓库并保持工作区状态ini_manage管理 INI 格式配置文件的键值http对 HTTP 接口发起请求并校验响应状态以file为例其核心函数在 salt/states/file.py 中均有实现managed第 2550 行起负责文件内容与权限管理directory第 4017 行起负责目录absent第 2187 行起负责删除append第 6942 行起与comment第 6735 行起负责追加与注释行操作。3.2 软件包管理模块用途pkg跨平台软件包安装/升级/删除installed、latest、removed、purgedpkgrepo配置软件源仓库pip_statePython 包pip管理chocolateyWindows 包管理dnfmoduleDNF 模块流管理pkgngFreeBSD pkgng 包管理pkgbuild构建打包winrepoWindows 软件源管理pyenvpyenv 管理的 Python 版本virtualenv_modPython 虚拟环境makeconfGentoo make.conf 配置pkg是薄状态、厚执行的典型它自身几乎不实现包管理逻辑全部委托给对应平台的pkg执行模块因此一份状态代码可以适配 apt、yum、pacman、brew 等众多后端详见 State Modules 编写指南 中的设计说明。3.3 用户、系统与内核模块用途user/group用户与组管理host/etc/hosts 条目管理mount文件系统挂载croncrontab 任务条目scheduleSalt 自身的调度任务sysctl/sysfs内核与 sysfs 参数environ环境变量管理locale/keyboard/timezone区域、键盘布局、时区kmod内核模块加载process进程管理status汇总系统状态logrotate日志轮转配置3.4 服务与可用性模块用途service服务启动/停止/重启是watchrequisite 最常用的配合对象uptime维持系统持续运行常用于 watch 触发响应3.5 存储与设备模块用途blockdev块设备管理disk磁盘状态检查lvmLVM 逻辑卷与卷组mdadm_raid软件 RAID 管理quota磁盘配额3.6 网络与防火墙模块用途network网络接口配置firewall/firewalld通用防火墙与 firewalldiptables/nftables/ipset规则表与集合管理netacl/netconfig网络 ACL 与配置netntp/netsnmp/netusers网络设备的 NTP、SNMP、用户配置ntpNTP 服务与配置3.7 安全、证书与 SSH模块用途tls/x509/x509_v2证书签发与管理x509_v2为新一代实现gpgGnuPG 密钥与信任管理ssh_auth管理 SSH 授权密钥ssh_known_hostsknown_hosts 条目ssh_pkiSSH 公钥基础设施管理selinuxSELinux 布尔值与模块linux_aclPOSIX ACL 管理3.8 数据库与消息队列模块用途postgres_cluster/postgres_database/postgres_default_privileges/postgres_extension/postgres_group/postgres_initdb/postgres_language/postgres_privileges/postgres_schema/postgres_tablespace/postgres_userPostgreSQL 的集群、库、扩展、组、权限、语言、schema、表空间、用户等全生命周期管理rabbitmq_cluster/rabbitmq_plugin/rabbitmq_policy/rabbitmq_upstream/rabbitmq_user/rabbitmq_vhostRabbitMQ 的集群、插件、策略、上游、用户、虚拟主机管理etcd_modetcd 键值管理3.9 Web 服务模块用途apacheApache 服务管理apache_conf/apache_module/apache_siteApache 配置片段、模块、站点启用3.10 Salt 平台自管理模块用途saltmod在 minion 上执行 salt 命令并等待结果saltutil同步模块、刷新 pillar、执行 highstate 等 Salt 自身运维salt_proxy/proxyproxy minion 管理beacon/eventBeacon 配置与事件发送module通过module.run调用任意执行模块执行模块不能直接当状态用必须经它包装stateconf面向 state 文件的结构化辅助模块loop循环调用子状态test测试状态test.succeed_without_changes等highstate_doc生成 highstate 文档grains管理 minion grains 值idem/ansiblegate集成 idem 与 Ansible 等外部引擎执行状态关于module.run官方 Configuration Management 概览 特别提醒执行模块不能直接在 SLS 中当状态调用例如user.rename这种写法是无效的必须写成rename_moe: module.run: - name: user.rename - m_name: moe - new_name: larry - onlyif: id moe3.11 macOS 专用mac_assistive辅助功能权限、mac_keychain钥匙串、mac_xattr扩展属性、macdefaultsdefaults 写入、macpackagepkg 安装。3.12 Windows 专用win_appx、win_certutil、win_dacl、win_dism、win_dns_client、win_dsc_resource、win_firewall、win_iis、win_lgpo、win_lgpo_reg、win_license、win_network、win_path、win_pki、win_powercfg、win_servermanager、win_shortcut、win_smtp_server、win_snmp、win_system、win_task、win_wua、win_wusa、reg注册表。它们覆盖 Windows 平台的服务、任务计划、本地组策略、IIS、防火墙、证书、软件更新等能力。3.13 其它工具型模块alias邮件别名、atat 任务、cloudsalt-cloud 管理、debconfmodDebian 预配置、syslog_ngsyslog-ng 配置、pythonPython 解释器相关、loop、uptime等。四、State 模块的返回值契约与 test 模式所有内置状态函数都必须返回一个包含四个键的字典这是 Salt 渲染状态输出的统一契约State Modules 编写指南 的 Return Data 一节name状态传入的name值changes描述所做变更的字典每个被变更对象对应一个子字典子字典含old与new两个键例如包管理状态返回{my_pkg_name: {old: , new: my_pkg_name-1.0}}result三态值——True表示成功False表示失败None表示处于 test 模式且本应做出变更注意 test 模式无法预测变更是否成功因此待定变更通常返回None但若能在不实际变更的情况下确定会失败也可返回False自 2018.3.0 起comment还支持字符串列表渲染时会以换行拼接comment单个字符串或字符串列表总结执行结果。场景live 模式 resulttest 模式 result无变更TrueTrue成功变更TrueNone失败变更FalseFalse或None状态不应返回无法序列化的数据如 frozenset否则会破坏跨进程传输。另外官方 State System Reference 还提到reload_modules这一被所有状态识别的布尔选项当状态执行改变了系统环境例如用cmd.run装了 pip而后续状态需要依赖新安装的库时可为前一个状态追加- reload_modules: true强制该状态结束后重载模块。Salt 并不会在每次状态运行时都重载模块因为那样会严重拖慢执行速度。五、编写自定义 State 模块5.1 分发与使用流程将自定义模块代码放入 master 文件服务器的salt://_states/目录通过saltutil.sync_states或saltutil.sync_all分发到 minion运行 highstate 时会自动同步自定义类型在 SLS 中像内置状态一样调用。一个最简单的示例把my_custom_state.py放进/srv/salt/_states/执行salt * saltutil.sync_states分发然后在 SLS 中human_friendly_state_id: # 任意状态 ID my_custom_state: # 自定义 state 模块名默认取自文件名 - enforce_custom_thing # 模块内的函数 - name: a_value # 映射到函数的 name 参数 - foo: Foo # 必选参数 - bar: False # 覆盖默认值注意文件名含连字符会破坏!pyobjects例程应坚持使用下划线与内置模块同名的自定义状态会覆盖内置实现模块名可通过__virtual__函数覆盖默认的文件名即模块名规则。5.2 推荐的七步实现范式官方 State Modules 编写指南 给出了一个被广泛遵循的编写范式初始化返回字典并做输入校验类型检查、互斥参数检查等用伴随的执行模块中的信息采集函数判断系统当前状态若已在目标状态直接返回True且不做任何变更若需要变更且处于testTrue模式返回None结果并给出将执行的变更描述调用执行模块实际执行变更再次调用采集函数确认结果并填充changes设置comment与result后返回。一个完整的参考实现同样来自该文档注意其调用my_custom_module执行模块完成实际工作import salt.exceptions def enforce_custom_thing(name, foo, barTrue): Enforce the state of a custom thing name The thing to do something to foo A required argument bar : True An argument with a default value ret { name: name, changes: {}, result: False, comment: , } # 1. 输入校验 if bar True and foo.startswith(Foo): raise salt.exceptions.SaltInvocationError( Argument foo cannot start with Foo if argument bar is True. ) # 2. 采集当前状态 current_state __salt__my_custom_module.current_state # 3. 已处于目标状态 if current_state foo: ret[result] True ret[comment] System already in the correct state return ret # 4. test 模式 if __opts__[test] True: ret[comment] The state of {0} will be changed..format(name) ret[changes] { old: current_state, new: Description, diff, whatever of the new state, } ret[result] None return ret # 5. 实际变更 new_state __salt__my_custom_module.change_state # 6/7. 确认并返回 ret[comment] The state of {0} was changed!.format(name) ret[changes] { old: current_state, new: new_state, } ret[result] True return ret5.3 状态间互调与日志状态模块之间可通过__states__字典互调例如ret __states__file.managed状态模块同样能访问__salt__执行模块与__grains__grains 数据建议把真正的工作交给执行模块完成状态模块只做变更前后检查。pkg状态是这种薄设计的代表——这也是为什么只有一份pkg状态却能适配众多包管理器而file模块则是逻辑内聚于状态模块的例外日志直接使用标准logginglog logging.getLogger(__name__)后调用log.info/warning/error。六、进阶接口Watcher 与 mod_init6.1 Watcher 函数若状态需要支持watchrequisite必须额外声明一个 watcher 函数。它接受与普通状态函数相同的参数requisite 触发时会被传入并执行状态特有的响应式行为——最典型的是service模块的 watcher 在被监视对象变化时重启服务。watcher 也必须返回与普通状态函数相同的四键字典。6.2 mod_init 接口某些状态需要在首次执行时做一次性环境准备。模块可定义mod_init(low)它接收当前状态的 low data可用state.show_lowstate查看其结构返回布尔值决定是否再次被调用——返回True表示初始化完成此后不再执行返回False则下次继续调用。pkg状态是经典示例首次安装包时只需刷新一次包数据库没必要每次安装都刷新。仓库中 salt/states/pkg.py 的实现证实了这一机制def mod_init(low): ret True if pkg.ex_mod_init in __salt__: ret __salt__pkg.ex_mod_init if low[fun] installed or low[fun] latest: salt.utils.pkg.write_rtag(__opts__) return ret return False它只有在即将执行installed/latest这类安装类操作时才写入刷新标记并返回True否则返回False以便下次再试。同文件中还可看到mod_aggregate第 3654 行起——它把一次状态运行中零散的包安装请求合并为单次pkgs批量操作这也是状态模块可选的聚合接口之一。七、查阅每个模块的 API 文档入口每个内置模块都在 doc/ref/states/all/ 下有一个独立 API 页如 salt.states.file.rst、salt.states.pkg.rst内容由automodule从源码 docstring 自动生成包含全部函数签名、参数说明与示例。结合以下配套文档即可完整掌握 Salt 状态体系State System ReferenceSLS 布局、top 文件、reload_modules 的完整讲解State Modules 编写指南本文第 4~6 节的原始出处与更多细节Highstate 数据结构状态的内部数据表示Requisites 与 Ordering依赖声明与执行顺序Top 文件环境与目标匹配的完整说明Configuration Management 概览状态与渲染器的系统定位。从源码侧salt/states/目录下的 132 个文件与 doc/ref/states/all/index.rst 的清单一一对应是核对模块能力、阅读实现细节的第一手资料。赞分享运维配置管理后端【免费下载链接】saltSoftware to automate the management and configuration of infrastructure and applications at scale.项目地址https://gitcode.com/gh_mirrors/sa/salt点击查看免费下载相关推荐Salt grains 状态模块完全指南用 State 管理 minion 的 grains 配置Salt grains 状态模块完全指南用 State 管理 minion 的 grains 配置 导读 grains 是 Salt 中挂在每台 minion运维配置管理后端Salt State 模块 chocolatey 完全指南用声明式状态管理 Windows 软件包Salt State 模块 chocolatey 完全指南用声明式状态管理 Windows 软件包 本指南以 Salt 官方文档中 salt.states.c运维配置管理后端Salt 的 ini_manage 状态模块用 State 声明式管理 INI 配置文件Salt 的 ini_manage 状态模块用 State 声明式管理 INI 配置文件 导读 在管理 api paste.ini 、 sysctl.conf运维配置管理后端上一篇Temporal部署指南如何在生产环境中安全迁移到新时间标准下一篇geometry3Sharp网格生成器揭秘从基本几何体到复杂曲面的生成算法创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表