集群环境

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:解析某一特定 service
  • role:解析某一特定角色
  • pkgpackage:解析某一特定 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