变量与模板
anx 使用 minijinja(Jinja2 语法)做字符串插值与条件表达式求值, 任何任务参数都可以引用变量。
变量优先级
同名变量按以下顺序覆盖(低 → 高):
| 优先级 | 来源 | 定义位置 |
|---|---|---|
| 1(最低) | inventory 全局 vars | inventory.yml 顶层 vars |
| 2 | 组 vars | groups.<组>.vars |
| 3 | 主机 vars | hosts.<主机>.vars |
| 4 | play vars | playbook 中 play 级 vars |
| 5(最高) | 额外变量 | 命令行 -e key=value(可多次) |
内置变量:inventory_hostname(当前主机在 inventory 中的名字)。
嵌套引用
变量值本身可以引用其他变量,渲染时递归展开:
# inventory.yml
vars:
app_root: /opt/demo-app
# playbook
- hosts: web
vars:
release_dir: "{{ app_root }}/releases" # 引用 inventory 变量
tasks:
- file:
path: "{{ release_dir }}" # 解析为 /opt/demo-app/releases
state: directory循环引用(如 a 引用 b、b 又引用 a)会在渲染时报「变量嵌套过深或存在循环引用」错误。
安全边界:
register 捕获的远端输出只作为数据参与渲染,永远不会被当作模板二次展开—— 远端命令输出里出现 {{ ... }} 不会引发模板注入。strict 模式
模板渲染与表达式求值都采用 strict 模式:引用未定义变量会立刻报错并标记任务失败, 而不是悄悄渲染成空字符串。变量名拼写错误会在第一时间暴露。
条件表达式
when / changed_when / failed_when 接受 minijinja 布尔表达式:
when: "nginx_status.rc != 0"
when: "role == 'frontend'"
when: "'active' in nginx_status.stdout"
changed_when: "false"
failed_when: "'ERROR' in result.stdout"changed_when / failed_when 中可用 result 引用本任务结果;shell 任务的结果包含 rc / stdout / stderr / failed。
命令行额外变量
anx run site.yml -e env=prod -e app_port=8080-e 的值按 YAML 标量解析:8080 是数字、true 是布尔。注意 1.10 这类值会被解析成 浮点数 1.1——版本号请在 playbook 模板里加引号或避免用 -e 传递。