GitHub

变量与模板

anx 使用 minijinja(Jinja2 语法)做字符串插值与条件表达式求值, 任何任务参数都可以引用变量。

变量优先级

同名变量按以下顺序覆盖(低 → 高):

优先级来源定义位置
1(最低)inventory 全局 varsinventory.yml 顶层 vars
2组 varsgroups.<组>.vars
3主机 varshosts.<主机>.vars
4play varsplaybook 中 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 引用 bb 又引用 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 传递。