一、为什么 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 变量以及更复杂的剧本设计,就会更容易理解和使用。