一、为什么 Ansible 里变量无处不在¶
原始笔记开头就强调了一点:
- 变量无处不在
- 在 Ansible 中大部分地方都可以定义变量
这意味着,只要你的剧本里出现:
- 路径
- 用户名
- IP 地址
- 服务名
- 文件名
这些会重复使用、可能变化的内容,就已经适合抽成变量。
二、Ansible 里常见的变量定义位置有哪些¶
原始笔记列出了多种变量来源:
| 变量定义位置 | 说明 |
|---|---|
| 在剧本文件中定义 | 比较常用,只在当前 Play 生效 |
| register 变量 | 用于获取命令结果 |
| 变量文件 / 按主机组定义 | 多个剧本共用时很常见 |
| inventory 主机清单中定义 | 可以用,但平时不算高频 |
| 命令行中定义 | 几乎不用 |
| facts 变量 | 用于获取主机基本信息 |
如果从日常使用频率看,最值得先掌握的是:
- Play 内变量
- 变量文件
group_vars
三、在剧本中直接定义变量¶
原始笔记指出,这种方式:
- 仅在当前 Play 中生效
- 很适合存放路径、用户名、IP 等局部变量
3.1 示例:批量创建目录¶
目标是批量创建:
/oldboy/lidao/upload/
剧本示例如下:
- hosts: all
vars:
dir: /oldboy/lidao/upload
tasks:
- name: mkdir
file:
path: "{{ dir }}"
state: directory
3.2 这个例子的重点¶
变量定义在:
vars:
dir: /oldboy/lidao/upload
然后在任务里通过:
"{{ dir }}"
进行引用。
原始笔记特别提醒:
- 如果变量出现在某个选项的开头,引用时最好加双引号
这是为了避免 YAML 解析上的歧义。
四、使用变量文件复用共用变量¶
当多个剧本都要使用相同变量时,直接写在单个 Play 里就不够灵活了,这时就更适合把变量单独放到文件里。
4.1 定义变量文件¶
原始笔记中的示例:
dir: /tmp/
file: lidao.txt
user: lidao996kkk
4.2 在剧本中引用变量文件¶
- hosts: all
vars_files: ./vars.yml
tasks:
- name: file
file:
path: "{{ dir }}/{{ user }}-{{ file }}"
state: touch
4.3 这个方式适合什么场景¶
变量文件特别适合:
- 多个剧本复用同一批变量
- 让剧本逻辑和配置参数分离
- 减少重复书写
从维护角度看,这比把变量散落写在每个剧本里更清晰。
五、按主机组使用共享变量:group_vars¶
这是 Ansible 变量体系里非常重要的一部分,原始笔记也给了高优先级标记。
5.1 group_vars 的核心思路¶
原始笔记总结得很直接:
group_vars会根据主机清单里的分组进行匹配- 不同主机组可以有不同变量文件
例如目录结构可以是:
group_vars/
lb/vars.yml
web/vars.yml
data/vars.yml
all/vars.yml
其中:
lb/vars.yml:给lb组使用web/vars.yml:给web组使用all/vars.yml:所有主机共用
5.2 原始笔记的建议¶
原始笔记提到,未来很多时候可以直接把通用变量放在:
group_vars/all/vars.yml
这样所有主机都能复用。
5.3 示例:定义 group_vars/all/vars.yml¶
原始笔记中的内容如下:
user: www
nfs_dir: /nfs_backup
web_mount_dir: /web_nfs
nfs_server: 192.168.1.22
rsync_pass: 1
5.4 剧本中直接使用 group_vars¶
示例剧本:
- hosts: all
tasks:
- name: 测试group变量
debug:
msg: "变量内容:{{ user }} {{ rsync_pass }}"
这里不需要显式写 vars_files,只要目录结构和命名正确,Ansible 就会自动匹配并加载这些变量。
六、这三种变量方式怎么选¶
可以用一个简单思路来判断。
6.1 只在当前 Play 里用¶
优先用:
vars
6.2 多个剧本共用一组变量¶
优先用:
vars_files
6.3 按主机组或所有主机统一管理变量¶
优先用:
group_vars
这样做能让剧本结构更清晰,也更接近大型项目中的组织方式。
七、为什么变量能显著提升剧本可维护性¶
一旦把路径、IP、用户名等信息硬编码写死,后续就会遇到这些问题:
- 环境变了要到处改
- 多个剧本容易不一致
- 复用性差
而变量的价值就在于:
- 剧本逻辑不变
- 只改变量就能适配新环境
这也是 Ansible 剧本从“小玩具”走向“可维护自动化”的关键一步。
八、小结¶
学习 Ansible 变量时,最值得优先掌握的内容有:
vars:适合当前 Play 的局部变量vars_files:适合独立变量文件复用group_vars:适合按主机组管理共享变量
当这三种方式真正掌握之后,后面的 facts 变量、register 变量以及更复杂的剧本设计,就会更容易理解和使用。