Ansible 里 vars
、set_fact
、register
虽然都能定义变量,但它们的作用方式、使用场景和生命周期是有区别的。下面一张表+详细解释,帮你快速掌握它们的区别👇
✅ 总览对比表
特性/方式 | vars | set_fact | register |
---|---|---|---|
定义方式 | 静态(写在 playbook/task 里) | 动态(运行时计算并设置) | 动态(从任务执行结果中提取) |
用于设置什么 | 任意固定值 | 任意计算结果、条件、变量合成 | 捕获命令或模块执行的返回结果 |
生命周期 | 当前 play/block/role 有效 | 当前 play 有效 | 仅当前 playbook 内有效 |
支持变量插值 | ✅ 支持 | ✅ 支持 | ✅ 返回结构体,需 .stdout 等属性 |
场景举例 | 配置默认参数、全局常量 | 条件语句、动态变量生成 | 捕获 command , uri , shell 等结果 |
🔹 vars
: 静态定义变量
📌 用于提前定义好的一些静态值、常量、默认参数
🔹 set_fact
: 动态设置变量(运行时计算)
用于 根据运行时条件、判断、组合等动态生成变量。
支持在 loop
或 when
中使用。
🎯 常见用途:
-
控制流程(if 判断结果后设置标志变量)
-
多个变量组合成一个新变量
-
某些变量根据主机不同需要动态计算
🔹 register
: 捕获任务返回结果
这是 执行命令、模块等后提取返回值的标准方法。
返回的是一个结构体,常用字段包括:
属性 | 说明 |
---|---|
stdout | 标准输出 |
stderr | 错误输出 |
rc | 返回码 |
changed | 是否改动了系统 |
stdout_lines | 输出按行拆分的列表 |
🧠 总结一句话记忆法:
vars
是写死的,启动前就知道;
set_fact
是你计算出来的,比如组合路径、拼接字符串;
register
是系统执行告诉你的,比如 curl 命令返回啥你才知道。