集群环境
core.is_master() -> bool
返回当前机器是否有 master 角色,例如简单升级脚本的第一行通常为
assert (core.is_master())
core.resolve
Core Resolve 依赖于 ambot-core 进行虚拟 hostname 的解析,core.resolve 会在调用时向 ambot-core 发起 RPC 调用来获取解析结果。
core.resolve 的函数原型为 core.resolve(targets: <str / [str]>, mode: str = "normal") -> [str] (返回值为解析完成的 hosts 列表)
在 v1.3.11 或更高版本中,core.resolve 可以接受一个
info=True参数来返回 Server 的详细信息,请参看下面的参数说明
参数 mode:解析模式(默认为 standard)
mode 参数在 ambot-script engine v1.3 系中 v1.3.8 或更高版本、v1.4 系中 v1.4.0-rc.16 或更高版本引入 旧版本将自动使用 standard 模式
当前 ambot-core 支持四种解析模式
- 标准模式 standard
- 增强模式 enhanced
- 模糊模式 fuzzy
- 严格模式 strict
| 模式 | 描述 | strict 严格模式 | standard 标准模式 | enhanced 增强模式 | fuzzy 模糊模式 |
|---|---|---|---|---|---|
| self | 本机 | ✓ | ✓ | ✓ | ✓ |
| all | 集群中所有机器 | ✓ | ✓ | ✓ | ✓ |
| {customName} | 外部传递想要使用的值 | ✓ | ✓ | ✓ | ✓ |
| +service | 集群中所有包含指定服务机器 | ✓ | ✓ | ✓ | ✓ |
| .role | 集群中所有包含指定角色机器 | ✓ | ✓ | ✓ | ✓ |
| :pkg-id | 集群中所有包含指定 package(利用 id 查询)机器 | ✓ | ✓ | ✓ | ✓ |
| :pkg-name | 集群中所有包含指定 package(利用 name 查询)机器 | ✓ | ✓ | ✓ | ✓ |
<ip-in-cluster> | 集群中存在指定 IP 的机器,返回 | ✓ | ✓ | ✓ | |
<hostname-in-cluster> | 集群中存在指定 hostname 的机器,返回 | ✓ | ✓ | ✓ | |
| service | 集群中所有包含指定角色机器 | ✓ | ✓ | ||
| role | 集群中所有包含指定角色机器 | ✓ | ✓ | ||
| pkg-name | 集群中所有包含指定 package(利用 name 查询)机器 | ✓ | ✓ | ||
| pkg-id | 集群中所有包含指定 package(利用 id 查询)机器 | ✓ | ✓ | ||
| IP 后缀匹配 | 集群中所有 IP 以指定 '.后缀' 结尾的机器 | ✓ | |||
| 机器 hostname 前缀匹配 | ✓ | ||||
| 机器 hostname 前缀匹配 | ✓ | ||||
| 纯数字 | 修改当前机器 IP 中 D 段 | ✓ | |||
| ip | 返回相应 IP | ✓ | ✓ | ✓ | |
| hostname | 返回相应 hostname | ✓ | ✓ | ✓ |
IP 后缀匹配在 ambot-script engine v1.3.22 引入
在 ambot-script engine v1.3.21 版本下纯数字优先级在机器 hostname 前缀匹配之前;
在 ambot-script engine v1.3.22 版本起纯数字优先级在机器 hostname 前缀匹配之后
第一个参数:目标机器 <str / List[str]>
用于指定想要解析的 hostname / ip / 虚拟hostname。返回值将返回分别解析的结果合并去重后的结果
扩展模式
对于以上的所有模式,单个虚拟 hostname 后可以加 #1 来代表只取第一个返回结果。因为 core.resolve 的返回值始终是排序的,因此对于相同的输入, #1 的结果是稳定的
{customName} 格式
当前仅供升级系统使用,利用 Dynamic Script 可以设定自定义的 key -> hosts 映射
allow_not_exist=True
默认情况下,如果引用了内部资源(例如查询一个 package),内部资源不存在会报错导致整个程序的中断。可以使用 allow_not_exist 来让程序返回空而不是中断运行。
allow_not_exist=True 的参数在 ambot-script-engine v1.3.11 及更高版本可用
info=True
默认情况下,core.resolve 返回的是解析完成的 hostname 列表
如果传递了 info=True,则返回的是 ServerInfo 列表
info=True 的参数在 ambot-script-engine v1.3.11 及更高版本可用
core.resolve_domain
core.resolve_domain 仅用于解析 Ambot 虚拟 Domain,不能用来进行标准的 DNS 解析。对于其他域名(任何不以 .ambot 结尾的域名)均会直接导致脚本异常结束
ambot virtual domain 采用 {参数}.{命名空间}.ambot 的格式
函数签名:core.resolve_domain(domain: str) -> List[str],即接收一个虚拟域名,返回域名对应的 IP 列表(可能为零个、一个或多个)
命名空间
命名空间是用于确认域名归属的,目前支持以下命名空间
enhanced:使用 Core.Resolve 的增强模式进行解析fuzzy:使用 Core.Resolve 的模糊模式进行解析service:解析某一特定 servicerole:解析某一特定角色pkg或package:解析某一特定 Package(支持使用 package id 或 package name)
命名空间支持「修饰符」,主要是针对多个返回值的情况的,修饰符的格式为将 {命名空间} 替换为 {修饰符}-{命名空间}。目前支持两个命名空间
first用于只取第一个结果(这一结果是稳定的,排序等同于 Core Resolve)any随机返回一个结果(任意两次调用结果可能相同可能不同)
命名空间参数
不同的命名空间有着不同的参数
enhanced, fuzzy 可接受的参数
去除掉命名空间和 .ambot 后缀的全部内容均是 enhanced 和 fuzzy 命名空间可接受的参数。但需要注意的是,因为域名的特殊性,+service :pkg-id .role
这种用法是无法实现的(因此并未支持标准模式),如需使用请使用其他命名空间。
几个例子
self.enhanced.ambot # 本机
master.enhanced.ambot # master 机器
sensor.first-enhanced.ambot # 第一台 Sensor
kafka.any-enhanced.ambot # 随机一台安装了kafka的机器
service 可接受的参数
Service 名称
即目前 Service 用法为 {Service 名称}.service.ambot
例如
nta-light-api.service.ambot # 安装了 nta-light-api service 的机器
agent.service.ambot # 安装了 agent service 的全部
role 可接受的参数
角色名称
即目前 Role 用法为 {角色名称}.role.ambot
另外,对于角色的场景,是可以省略 role 的,即直接使用 {角色名称}.ambot 也是可以的
例如
master.ambot
sensor.ambot
sensor.role.ambot
master.role.ambot
pkg/package 可接受的参数
Package ID 或 Package Name
例如
matrix.pkg.ambot
matrix.package.ambot
com.topahnt.matrix.pkg.ambot
com.topahnt.matrix.package.ambot