运维配置管理后端【免费下载链接】saltSoftware to automate the management and configuration of infrastructure and applications at scale.项目地址https://gitcode.com/gh_mirrors/sa/salt点击查看免费下载导读salt.modules.sdb是 Salt 中负责小数据库查询SDB接口的执行模块它把对 keyring、etcd、memcached、vault、YAML 文件、环境变量等外部数据源的读写统一收敛为sdb://profile/key形式的紧凑 URI让 Pillar、Grains、配置文件和 Jinja 模板都能以同一套语法访问非 minion 专属的共享数据典型场景是集中存放密码、密钥与口令。读完本文你将掌握sdb.get、sdb.set、sdb.delete、sdb.get_or_set_hash四个函数的使用方法、URI 解析规则、profile 配置方式以及底层salt/utils/sdb.py的实现原理与编写自有 SDB 驱动模块的规范。本文的关联文档为 doc/ref/modules/all/salt.modules.sdb.rst其内容由.. automodule:: salt.modules.sdb自动生成对应源码实现位于 salt/modules/sdb.pySDB 的完整用户指南见 doc/topics/sdb/index.rst。SDB 是什么为什么需要这个执行模块Salt 管理数据的主要载体是 Pillar 与 Grains但这两者都是minion 专属per-minion的数据。当需要存储跨 minion 共享、且不宜明文落盘的数据时例如多个 minion 共用的数据库口令、OpenStack 云账号密码SDB 接口应运而生。SDB 是 Salt 在 2014.7.0 版本引入的通用数据库抽象层其设计初衷正是把密码存进安全的数据库如 keyring 管理的数据源而不是明文文件。salt.modules.sdb是这个抽象层面向命令行与状态编排的前端执行模块它自身不直接与任何数据库打交道而是把 URI 解析、profile 查找、驱动装载等脏活委托给 salt/utils/sdb.py 中的sdb_get/sdb_set/sdb_delete/sdb_get_or_set_hash四个工具函数完成。核心函数详解模块源码 salt/modules/sdb.py 定义了四个公开函数并在模块顶部通过__func_alias__将内部命名的set_对外暴露为set因为set是 Python 内置函数不能直接用作函数名__func_alias__ { set_: set, }sdb.get读取一个值get(uri, strictFalse)从数据库中读取指定 key 的值。URI 的合法形式为sdb://profile/key如果传入的 URI 不合法函数会原样返回该 URI 字符串除非显式传入strictTrue此时抛出SaltInvocationError。salt * sdb.get sdb://mymemcached/foo strictTrue关于strict参数的两个典型行为见 salt/utils/sdb.pyURI 不以sdb://开头非严格模式下直接返回原 URI严格模式下抛异常URI 形如sdb://profile缺少/key部分或 profile 中未定义driver非严格模式返回原 URI严格模式抛异常。sdb.set写入一个值set(uri, value)把 value 写入指定 key。若 URI 不以sdb://开头、URI 缺少 key 段、或对应 profile 未配置driver一律返回False。salt * sdb.set sdb://mymemcached/foo barsdb.delete删除一个值delete(uri)删除指定 key前提是所用驱动支持删除操作如只读源则不适用。校验规则与set完全一致失败返回False。salt * sdb.delete sdb://mymemcached/foosdb.get_or_set_hash一次性生成并固化随机密钥get_or_set_hash(uri, length8, charsabcdefghijklmnopqrstuvwxyz0123456789!#$%^*(-_))是四个函数中最具实战价值的一个它先尝试从 SDB 读取若值尚不存在则基于random.SystemRandom().choice(chars)生成长度为length的随机字符串并写入 SDB之后返回该值若已存在则直接返回旧值见 salt/utils/sdb.py。这非常适合为多台 minion 生成共享且必须一致的密码或密钥——比如为所有 minion 上的同一个 MySQL 用户生成统一口令且口令只需要生成一次、之后持久复用。典型用法是在 State 的 Jinja 中直接内联some_mysql_user: mysql_user: - present - host: localhost - password: {{ saltsdb.get_or_set_hash }}命令行调用示例第二个参数指定生成长度不传时默认 8salt * sdb.get_or_set_hash sdb://mymemcached/SECRET_KEY 50YAML 转义警告该函数生成的随机串可能包含 YAML 解析器视为指令的保留字符如以%开头。在包含 YAMLJinja 的 SLS 文件中使用其输出时务必用单引号包裹整个调用表达式避免 YAML 解析异常。Profile 配置与 URI 解析规则配置放置位置使用 SDB 前必须先定义 profile即驱动配置。放置位置决定其可用范围见 doc/topics/sdb/index.rst供master 侧命令runner使用 → 配置在 master 配置文件中供minion 上执行的模块使用 → 配置在 minion 配置文件中或作为Pillar下发。一个使用 keyring 模块system服务的 profile 示例mykeyring: driver: keyring service: systemprofile 名称会出现在 SDB URI 中建议保持简短。例如一个 OpenStack 账号凭据 profilekevinopenstack: driver: keyring service: salt.cloud.openstack.kevinURI 语法与 sub-key 寻址URI 基本格式为sdb://profile/argsprofile指向上述配置args由具体驱动解释通常只是一个 keyprofile 本身应承载尽量多的参数。对上例取密码salt-call sdb.get sdb://kevinopenstack/password对于嵌套字典结构的 sub-key如users: user1: id: 12345命令行中用冒号分隔子键层级salt-call sdb.get sdb://users:user1:id在 State 文件中同样使用冒号语法由底层salt.utils.data.traverse_dict_and_list实现嵌套遍历users: user1: id: sdb.get sdb://users:user1:id底层解析流程以sdb_get为例salt/utils/sdb.py 的解析步骤清晰可循校验uri是字符串且以sdb://开头否则按strict决定返回原值或抛SaltInvocationError取sdb://之后、第一个/之前的部分作为profile 名若找不到/或/后为空视为非法 URI在opts中查找该 profile若顶层配置中不存在回退到opts.get(pillar, {}).get(profile)这正是profile 可以放在 Pillar的实现依据校验 profile 含driver键否则按strict处理拼出驱动函数名{driver}.get取/之后的串作为 query key通过salt.loader.sdb动态装载对应驱动并调用。set与delete的解析逻辑同构分别调用{driver}.set与{driver}.delete且失败路径一律返回False而非抛出异常。在配置文件与模板中使用 SDB URISDB URI 可以直接写进配置文件如/etc/salt/master、/etc/salt/minion、/etc/salt/cloud由config.get解析后透传mykey: sdb://myetcd/mykey在模块代码中通过config.get读取mykey __salt__config.get在 Jinja 模板中config.get与直接调用sdb.get两种方式等价{{ saltconfig.get }} {{ saltsdb.get }}编写 Salt 模块时官方建议使用config.get而非直接调用sdb.get前者让使用者无需关心内部具体 URI仅需在配置中填写即可后者则要求调用方硬编码特定sdb://URI。除了执行模块runner 系统同样暴露了这三个操作见 doc/topics/sdb/index.rst可在 master 侧直接管理数据salt-run sdb.get sdb://myvault/secret/salt/saltstack salt-run sdb.set sdb://myvault/secret/salt/saltstack super awesome salt-run sdb.delete sdb://mykvstore/foobar仓库内置驱动实例env 与 yamlsalt.modules.sdb是通用前端真正的读写逻辑在各驱动模块中。本仓库的 salt/sdb 目录内置了env与yaml两个参考驱动其余常见驱动如keyring、etcd、vault、memcached等以扩展形式提供。env 驱动读写环境变量salt/sdb/env.py 把 SDB 当作环境变量的访问入口配置极简osenv: driver: envget(key)等价于os.environ.get(key)set_(key, value)使用os.environ.setdefault(key, value)注意是 setdefault已存在的变量不会被覆盖。该驱动文档明确警告启用后所有 OS 环境变量都可通过 SDB 读取切勿在环境变量中存放敏感数据。它的一个巧妙用法是配合 salt-cloud把云配置中的键绑定到环境变量上假设已导出环境变量computemy-openstack-config: compute_name: sdb://osenv/computeyaml 驱动从 YAML 文件拉取值salt/sdb/yaml.py 自 2017.7.0 起提供将多个 YAML 文件合并后按 Salt 的 Grains/Pillar 数据遍历机制寻值。基础配置my-yaml-file: driver: yaml files: - /path/to/foo.yaml - /path/to/bar.yaml可选配置merge与gpg自 2018.3.0 起可用my-yaml-file: driver: yaml files: - /path/to/foo.yaml - /path/to/bar.yaml merge: strategy: smart merge_list: false gpg: truemerge多个文件合并时交给salt.utils.dictupdate.merge的策略参数如strategy、merge_listgpg: true读取时通过 GPG renderersalt/renderers/gpg.py解密内嵌的 GPG 加密数据默认false该驱动的set_直接抛出salt.exceptions.NotImplemented即YAML 驱动只读写入须直接编辑文件文件缺失或反序列化失败时记录 error 日志并跳过该文件不影响其余文件合并。在 State 的 Jinja 中使用 env 驱动的完整示例写入环境变量后立即读取验证set some env var: cmd.run: - name: echo {{ saltsdb.set }} - order: 1 {% if saltsdb.get bar %} always-changes-and-succeeds: test.succeed_with_changes: - name: foo {% else %} always-changes-and-fails: test.fail_with_changes: - name: foo {% endif %}编写自有 SDB 驱动模块的规范若内置驱动不满足需求可按以下契约在salt/sdb/下编写自定义驱动详见 doc/topics/sdb/index.rst函数要求说明get(key, profileNone)必须实现config.get等内部调用依赖它完成sdb://URI 求值set_(key, value, profileNone)建议实现只读源可省略实现时必须同时声明__func_alias__将set_映射为setdelete(key, profileNone)可选实现只读或禁止删除操作的源可省略关键约定__func_alias__ { set_: set, }由于set是 Python 内置函数驱动内不得定义名为set()的函数__func_alias__由 Salt 的 loader 机制提供让合法命名的set_对外以set呈现。get()是硬性要求因为config.get执行模块在解析配置值时会调用它。官方推荐的自学范例是salt/sdb/keyring_db.py本仓库镜像中位于 salt/sdb 目录的姊妹扩展中它覆盖了 SDB 乃至 Salt 模块的大部分典型写法。小结salt.modules.sdb以四个简洁函数get/set/delete/get_or_set_hash向用户暴露了 SDB 的全部核心能力底层由 salt/utils/sdb.py 完成 URI 解析、profile 查找与驱动装载驱动侧则由各 SDB 模块落实具体数据库操作。掌握 profile 配置位置master / minion / Pillar、URI 冒号子键语法、strict行为以及get_or_set_hash的生成一次、持久复用语义即可把密码、密钥等共享敏感数据从明文配置中解放出来统一收敛到安全后端并在配置、模板、runner 与 State 编排中无缝复用。赞分享运维配置管理后端【免费下载链接】saltSoftware to automate the management and configuration of infrastructure and applications at scale.项目地址https://gitcode.com/gh_mirrors/sa/salt点击查看免费下载相关推荐Salt 执行模块实战用 salt.modules.sqlite3 在 Minion 上直接操作 SQLite 数据库Salt 执行模块实战用 salt.modules.sqlite3 在 Minion 上直接操作 SQLite 数据库 本篇文章以 Salt 开源仓库中的 S运维配置管理后端Salt 的 data 执行模块minion 本地持久化数据仓库datastore完全指南Salt 的 data 执行模块minion 本地持久化数据仓库datastore完全指南 导读 salt.modules.data 是 Salt 内置的运维配置管理后端Salt 执行模块 mount 完全指南fstab 管理、挂载操作与 swap 控制Salt 执行模块 mount 完全指南fstab 管理、挂载操作与 swap 控制 导读 mount 是 Salt 提供的 Unix/POSIX 系统文件系运维配置管理后端创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
