资讯动态

Salt RabbitMQ 执行模块完全指南:用户、vhost、权限、策略、插件与集群管理

发布时间:2026/9/23 18:12:32 来源:尧图企业网站定制
运维配置管理后端【免费下载链接】saltSoftware to automate the management and configuration of infrastructure and applications at scale.项目地址https://gitcode.com/gh_mirrors/sa/salt点击查看免费下载Salt 的rabbitmq执行模块为 minion 上的 RabbitMQ 消息代理提供了完整的运维封装通过薄封装rabbitmqctl与rabbitmq-plugins命令行工具把用户、vhost、权限、策略、插件、队列、集群以及 federation upstream 等日常管理操作统一暴露为可远程调用的 Salt 函数。本指南基于当前仓库 salt/modules/rabbitmq.py 的完整实现撰写涵盖全部公开函数的用法、参数语义、返回值结构、底层调用链以及它们与 rabbitmq_user、rabbitmq_vhost、rabbitmq_policy、rabbitmq_plugin、rabbitmq_cluster、rabbitmq_upstream等 state 模块的协作方式。读完本文你将能够通过 Salt 对 RabbitMQ 进行声明式或命令式的全生命周期管理并理解其命令输出解析、跨版本兼容等底层机制。该模块的 API 文档入口位于 doc/ref/modules/all/salt.modules.rabbitmq.rst它是 Sphinx 的automodule存根实际生成内容即模块源码中的 docstring。模块源码头部标注的 TODO 表明集群支持、日志与 minion 配置数据仍在持续完善中。模块加载条件与平台适配加载校验__virtual__模块的__virtual__()函数负责判断 RabbitMQ 是否安装只有找到rabbitmqctl命令时才允许模块加载在非 Windows 平台通过salt.utils.path.which(rabbitmqctl)查找rabbitmqctl同时用salt.utils.path.which(rabbitmq-plugins)定位插件管理工具两者路径分别缓存到模块级变量RABBITMQCTL与RABBITMQ_PLUGINS在 Windows 平台则从注册表SOFTWARE\VMware, Inc.\RabbitMQ Server读取安装目录并在其中寻找rabbitmq_server-*子目录取 ASCII 序最大的一个拼接出sbin\rabbitmqctl.bat与sbin\rabbitmq-plugins.bat若找不到rabbitmqctl模块返回(False, Module rabbitmq: module only works when RabbitMQ is installed)Salt 加载器会跳过该模块。因此使用本模块的前提是目标 minion 上已安装并配置好 RabbitMQ Server且rabbitmqctl位于 PATH 中Windows 下需为官方安装包布局。runas 参数约定绝大多数函数都接受runas参数用于指定执行命令的系统用户。实现中有统一的默认行为见 list_users 等函数的开头非 Windows 平台runas为空时默认取salt.utils.user.get_user()即当前运行 Salt 的系统用户Windows 平台由于runas需要密码模块刻意不为 Windows 提供默认值调用时必须显式传入。Windows 特殊处理Windows 上若密码包含|等特殊字符普通的参数数组执行会失败stderr 会报def is not recognized as...。因此 add_user、change_password、check_password在 Windows 下会改用python_shellTrue并用引号包裹命令字符串来规避该问题。命令执行与输出解析机制所有函数最终都通过__salt__cmd.run_all执行命令且统一传入reset_system_localeFalse、python_shellFalse以数组形式传递参数避免 shell 注入。理解模块内部几个解析辅助函数有助于读懂各函数的返回值形态_check_response对cmd.run_all的返回字典检查retcode与stderr非零或存在 stderr 时抛出CommandExecutionError_format_response(response, msg)成功时返回{msg: stdout}形态的字典如{Added: ...}失败抛异常_safe_output/_strip_listing_to_done过滤 rabbitmqctl 输出中的噪音行如Listing ... ...首尾行、...done、WARNING:前缀行和空行_output_to_dict把rabbitmqctl ... -q的制表符分隔输出解析为{key: values_list}字典同时处理只有 key 没有值的边界情况如用户对/的空权限串RabbitMQ 只输出/此时将值置为空字符串_output_to_list/_output_lines_to_list分别按空白、按行把输出解析为列表。单元测试 tests/pytests/unit/modules/test_rabbitmq.py 验证了这些解析逻辑例如test_list_users_rabbitmq2用 mock 的cmd.run_all返回guest\t[administrator, user]\njustAnAdmin\t[administrator]断言list_users()解析为{guest: [administrator, user], justAnAdmin: [administrator]}test_list_users_with_warning_rabbitmq2则验证即使输出以WARNING: ignoring /etc/rabbitmq/rabbitmq.conf ...开头解析结果依然正确。用户管理用户管理相关函数均基于rabbitmqctl的用户子命令实现。查询与存在性判断rabbitmq.list_users执行rabbitmqctl list_users -q把用户名\t[tag1, tag2]行解析为{user: [tags]}字典rabbitmq.user_exists name基于list_users判断用户是否存在返回布尔值。CLI 示例salt * rabbitmq.list_users salt * rabbitmq.user_exists rabbit_user创建与删除rabbitmq.add_user name [password]执行rabbitmqctl add_user name password。若未提供密码模块会用random.SystemRandom()生成一个 15 位随机临时密码大写字母 数字创建成功后再调用clear_password清空该临时密码并记录日志output_loglevelquiet防止密码泄露到日志清空失败时回滚删除用户并抛出异常。成功返回{Added: ...}rabbitmq.delete_user name执行rabbitmqctl delete_user成功返回{Deleted: ...}。CLI 示例salt * rabbitmq.add_user rabbit_user password salt * rabbitmq.delete_user rabbit_user密码管理rabbitmq.change_password name password调用rabbitmqctl change_password成功返回{Password Changed: ...}同样使用output_loglevelquietrabbitmq.clear_password name调用rabbitmqctl clear_password成功返回{Password Cleared: ...}rabbitmq.check_password name password2016.3.0 起校验用户密码是否有效返回布尔值。实现有版本分叉见 check_password先执行rabbitmqctl status解析服务器版本。通过正则匹配新版输出的RabbitMQ version: X.Y.Z或旧版 Erlang term 形式的{rabbit,RabbitMQ,X.Y.Z}无法识别时回退为(0, 0, 0)版本 ≥ 3.5.7RabbitMQ 原生引入密码校验 API时执行rabbitmqctl authenticate_user name passwordretcode为 0 且无 stderr 则返回True更早版本则通过rabbitmqctl eval执行 Erlang 代码rabbit_auth_backend_internal:check_user_login(name, [{password, password}])输出含invalid credentials时返回False。CLI 示例salt * rabbitmq.change_password rabbit_user password salt * rabbitmq.clear_password rabbit_user salt * rabbitmq.check_password rabbit_user password用户标签rabbitmq.set_user_tags name tags...调用rabbitmqctl set_user_tags。tags可为单个字符串或列表/元组模块会自动把标量包装为列表。成功返回{Tag(s) set: ...}。CLI 示例salt * rabbitmq.set_user_tags myadmin administrator salt * rabbitmq.set_user_tags myadmin administrator monitoringvhost 管理rabbitmq.list_vhosts执行rabbitmqctl list_vhosts -q返回 vhost 名列表rabbitmq.vhost_exists name判断 vhost 是否存在rabbitmq.add_vhost vhost执行rabbitmqctl add_vhost成功返回{Added: ...}rabbitmq.delete_vhost vhost执行rabbitmqctl delete_vhost成功返回{Deleted: ...}。CLI 示例salt * rabbitmq.list_vhosts salt * rabbitmq.vhost_exists rabbit_host salt * rabbitmq.add_vhost vhost_name salt * rabbitmq.delete_vhost vhost_name注意 vhost 名为/默认 vhost时在 CLI 中需加引号防止被 shell 解释为路径分隔符。权限管理rabbitmq.set_permissions vhost user [conf] [write] [read]执行rabbitmqctl set_permissions -p vhost user conf write read。三个权限正则默认值均为.*授予全部权限。成功返回{Permissions Set: ...}rabbitmq.list_permissions vhost执行rabbitmqctl list_permissions --formatterjson -p vhost用salt.utils.json.loads解析 JSON返回{user: {configure, write, read}}字典去掉冗余的user键rabbitmq.list_user_permissions user执行rabbitmqctl list_user_permissions user --formatterjson返回{vhost: {configure, write, read}}字典。CLI 示例salt * rabbitmq.set_permissions myvhost myuser salt * rabbitmq.list_permissions /myvhost salt * rabbitmq.list_user_permissions user权限管理的默认值语义conf/write/read 均为.*意味着set_permissions myvhost myuser会赋予该用户在 myvhost 上的完全控制权实操中应显式给出最小化正则。队列查询rabbitmq.list_queues [queueinfoitem...]执行rabbitmqctl list_queues -q返回默认 vhost/的队列详情字典后续参数会原样追加到命令尾部可传messages、consumers等任意rabbitmqctl list_queues支持的 info itemrabbitmq.list_queues_vhost vhost [queueinfoitem...]为指定 vhost 查询队列-p vhostvhost 为/时应使用list_queues。CLI 示例salt * rabbitmq.list_queues messages consumers salt * rabbitmq.list_queues_vhost /myvhost messages consumers状态、应用控制与集群管理rabbitmq.status返回rabbitmqctl status的原始输出字符串用于健康检查rabbitmq.cluster_status返回rabbitmqctl cluster_status的原始输出rabbitmq.stop_app/rabbitmq.start_app停止/启动 RabbitMQ 应用保留 Erlang 节点分别对应rabbitmqctl stop_app/start_apprabbitmq.reset/rabbitmq.force_reset将节点恢复到初始状态分别对应rabbitmqctl reset/force_reset后者在有磁盘节点时也可强制重置rabbitmq.join_cluster host [user] [ram_node]加入 RabbitMQ 集群见 join_cluster。参数user默认为rabbit构造目标节点为userhostram_node为真时追加--ram以 RAM 节点身份加入。函数内部自动完成stop_app→join_cluster→start_app三步成功返回{Join: ...}。CLI 示例salt * rabbitmq.status salt * rabbitmq.cluster_status salt * rabbitmq.join_cluster rabbit.example.com rabbit salt * rabbitmq.stop_app salt * rabbitmq.start_app salt * rabbitmq.reset salt * rabbitmq.force_reset策略Policy管理策略用于实现队列镜像HA、TTL 等高级功能实现参照 RabbitMQ 官方 HA 文档的语义。rabbitmq.list_policies [vhost/]执行rabbitmqctl list_policies -q -p vhost返回按 vhost 与策略名嵌套的字典。解析时用pkg.version(rabbitmq-server)FreeBSD 上用pkg.version(rabbitmq)探测版本处理了 RabbitMQ 3.7 中apply_to与pattern列位置互换的差异见 list_policies≥ 3.7字段顺序为pattern, apply_to, definition, priority更早版本apply_to在位置 2 插入模块用offset len(parts) - 5兼容 5 列与 6 列两种输出。rabbitmq.set_policy vhost name pattern definition [priority] [apply_to]调用rabbitmqctl set_policy -p vhost [--priority N] [--apply-to TYPE] name pattern definition。definition可以是 JSON 字符串或 Python 字典模块自动json.dumps若两者都不是则抛出SaltInvocationError(The definition argument must be a dictionary or JSON string)。成功返回{Set: ...}rabbitmq.delete_policy vhost name对应rabbitmqctl clear_policy成功返回{Deleted: ...}rabbitmq.policy_exists vhost name基于list_policies判断策略是否存在。CLI 示例salt * rabbitmq.list_policies salt * rabbitmq.set_policy / HA .* {ha-mode:all} salt * rabbitmq.delete_policy / HA salt * rabbitmq.policy_exists / HAset_policy / HA .* {ha-mode:all}会把默认 vhost 中所有队列配置为全节点镜像HA。插件管理插件管理基于rabbitmq-plugins命令。注意_get_rabbitmq_plugin()的兜底逻辑见 [salt/modules/rabbitmq.py#L104-L121]若rabbitmq-plugins不在标准 PATH 中会通过pkg.version(rabbitmq-server)取版本号构造/usr/lib/rabbitmq/lib/rabbitmq_server-version/sbin/rabbitmq-plugins路径。rabbitmq.list_available_plugins执行rabbitmq-plugins list -m返回可用插件名列表含已启用与未启用rabbitmq.list_enabled_plugins执行rabbitmq-plugins list -m -e返回已启用插件列表rabbitmq.plugin_is_enabled name判断插件是否启用rabbitmq.enable_plugin name执行rabbitmq-plugins enable成功返回{Enabled: ...}rabbitmq.disable_plugin name执行rabbitmq-plugins disable成功返回{Disabled: ...}。CLI 示例salt * rabbitmq.list_available_plugins salt * rabbitmq.list_enabled_plugins salt * rabbitmq.plugin_is_enabled rabbitmq_plugin_name salt * rabbitmq.enable_plugin foo salt * rabbitmq.disable_plugin fooFederation Upstream 管理set_upstream、list_upstreams、upstream_exists、delete_upstream四个函数3000 版本加入用于配置 RabbitMQ 联邦Federation上游实现跨集群的消息/交换器联邦。rabbitmq.list_upstreams执行rabbitmqctl list_parameters -q过滤出形如federation-upstream\tname\tdefinition的行返回{name: definition_json}字典rabbitmq.upstream_exists name判断上游是否存在rabbitmq.set_upstream name uriuri [params...]执行rabbitmqctl set_parameter federation-upstream name json。模块用salt.utils.data.filter_falsey过滤掉未传参数再json.dumps成 definition。完整参数表如下参数类型默认值说明适用对象uristr必填上游的 AMQP URI交换器/队列prefetch_countint1000每条链路最多未确认消息数交换器/队列reconnect_delayint1断线后重连等待秒数交换器/队列ack_modestron-confirm确认模式on-confirm下游确认后回执最慢但最安全、on-publish下游发布后回执丢 broker 故障消息、no-ack最快可能丢消息交换器/队列trust_user_idbool未设置为真时透传上游已验证的 user-id仅在信任上游时不建议随意开启交换器/队列exchangestr与被联邦交换器同名上游交换器名交换器max_hopsint1消息可穿越的联邦链路最大跳数交换器expiresintnone断连后上游队列可被删除的过期时间毫秒对应x-expires交换器message_ttlintnone上游队列消息 TTL毫秒对应x-message-ttl不适用于联邦队列交换器ha_policystrnone上游队列的x-ha-policy参数用于旧版 broker 的 HA 声明交换器queuestr与被联邦队列同名上游队列名队列CLI 示例来自 docstringsalt * rabbitmq.set_upstream upstream_name ack_modeon-confirm max_hops1 \ trust_user_idTrue uriamqp://hostname salt * rabbitmq.delete_upstream upstream_namerabbitmq.delete_upstream name执行rabbitmqctl clear_parameter federation-upstream name成功返回True。与 State 模块的声明式集成rabbitmq执行模块是 6 个 state 模块的底层支撑rabbitmq_user、rabbitmq_vhost、rabbitmq_policy、rabbitmq_plugin、rabbitmq_cluster、rabbitmq_upstream。以 rabbitmq_user.py 为例可以看到典型的声明式封装模式__virtual__()同样检查rabbitmqctl是否存在于 PATH否则拒绝加载rabbitmq_user.present(name, password, force, tags, perms, runas)通过rabbitmq.user_exists、rabbitmq.check_password判断是否需要变更用户已存在、密码正确、无force、无 tags/perms 变更时直接返回result: TrueUser xxx is already present.新用户走rabbitmq.add_user并记录changes.user已有用户且force或密码校验失败时走rabbitmq.change_password未传密码则clear_passwordtags 通过集合对称差set(tags) ^ set(current_tags)判定差异后调用rabbitmq.set_user_tagsperms 通过_check_perms_changes与rabbitmq.list_user_permissions对比正确处理权限已设置为空再置空不报告变更的幂等场景全程支持 Salt 的test模式仅报告变更而不真正执行。对应的声明式 SLS 示例摘自 rabbitmq_user.py 顶部 docstringrabbit_user: rabbitmq_user.present: - password: password - force: True - tags: - monitoring - user - perms: - /: - .* - .* - .* - runas: rabbitmq其余 state 模块vhost、policy、plugin、cluster、upstream采用同样的exists 判断 执行模块调用 幂等比对模式可配合 Salt 的 orchestrate 或 highstate 实现 RabbitMQ 配置的完全代码化管理。测试与验证路径仓库为模块提供了多层测试证据可作为回归验证与学习参考单元测试 tests/pytests/unit/modules/test_rabbitmq.py以 mockcmd.run_all的方式覆盖list_users的标签解析、WARNING 行过滤、权限/策略/上游等函数的返回解析不依赖真实 RabbitMQ 环境集成测试 tests/integration/modules/test_rabbitmq.py 与 tests/integration/states/test_rabbitmq_user.py、tests/integration/states/test_rabbitmq_vhost.py需要真实 minion 与 RabbitMQ 服务覆盖执行模块与 state 的端到端行为。注意事项与限制模块依赖目标机器上存在rabbitmqctl所有命令均以cmd.run_all且python_shellFalse执行参数不经过 shell 解释天然避免命令注入Windows 平台密码含特殊字符时需依赖模块内置的 shell 引用兜底runas在 Windows 上必须显式指定策略解析对 RabbitMQ 3.7 前后的输出列序做了兼容若使用更新的 RabbitMQ 版本需关注list_policies输出格式是否再次变化部分函数如list_queues只针对默认 vhost有明确的使用边界跨 vhost 场景应选用list_queues_vhost模块源码头部仍留有Todo: A lot注释集群相关的深层编排如节点角色规划建议结合 rabbitmq_cluster state 使用。赞分享运维配置管理后端【免费下载链接】saltSoftware to automate the management and configuration of infrastructure and applications at scale.项目地址https://gitcode.com/gh_mirrors/sa/salt点击查看免费下载相关推荐使用 Salt 的 cassandra_cql 执行模块远程管理 Cassandra 集群CQL 查询、Keyspace、用户与权限全指南使用 Salt 的 cassandra_cql 执行模块远程管理 Cassandra 集群CQL 查询、Keyspace、用户与权限全指南 本篇技术指南围绕运维配置管理后端Salt 执行模块 pw_user 完全指南在 FreeBSD 上用 pw(8) 管理用户Salt 执行模块 pw_user 完全指南在 FreeBSD 上用 pw 8 管理用户 导读 pw_user 是 Salt 中面向 FreeBSD / Dr运维配置管理后端Salt 中 FreeBSD pkgng 软件包管理执行模块完全指南Salt 中 FreeBSD pkgng 软件包管理执行模块完全指南 本文档基于 Salt 开源仓库中 salt/modules/pkgng.py https:运维配置管理后端创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价