RH294 第 3 章 管理变量和事实
一、管理变量
变量 = 给数据起名字,不用写死数值,方便修改复用。
1、变量定义位置(优先级:越往下优先级越高,会覆盖上面)
- Inventory 清单内:主机变量、组变量(给机器 / 机器组设置变量)
- 目录方式:host_vars/主机名.yml、group_vars/组名.yml,单独文件存变量,推荐用。
- Playbook 内部:play 下vars:块,只对当前这个 play 生效
- 命令行传入:‑e "var=xxx",优先级最高,会覆盖所有其他地方变量
优先级:命令行 - e > playbook 内 vars > inventory 主机变量 > inventory 组变量
2、变量引用
用双大括号 {{ 变量名 }}
3、复杂变量
- 字典:key: {k1:v1, k2:v2},取值两种写法 user.name / user'name'
- 列表:数组,存放一组数据
4、管理变量


两个play,第一个play五个task,第二个play一个task,所有用到的变量写在vars里统一存储,需要修改变量时只改vars里的,task里用到的会随时同步更新,方便修改。
ansible-navigator run -m stdout playbook.yml -e "web_pkg=nginx"
(命令行覆盖变量,把 web 服务器换成 nginx)
ansible‑navigator run -m stdout playbook.yml --syntax‑check
(语法检查,只校验 yml 语法,不会真正执行)
ansible‑navigator run -m stdout playbook.yml
(真正执行 playbook,并把内容显示在终端上)
二、Ansible‑Vault(加密敏感数据)
密码、数据库密码不能明文写 yml,用 vault 加密文件。
bash
#新建加密文件
ansible-vault create secret.yml
#编辑加密文件
ansible-vault edit secret.yml
#加密已存在明文文件
ansible-vault encrypt plain.yml
#解密
ansible-vault decrypt secret.yml
#运行带vault的playbook
ansible-navigator run play.yml -m stdout --ask-vault-pass
注意:只能加密整个文件,不能加密 yml 里面某一行。
三、事实 facts(重点,考试常考)
Facts(事实):Ansible 执行 playbook 时,自动收集受控主机的系统信息(主机名、CPU、内存、Python 版本、网卡等),全部存放在内置变量 ansible_facts 里,不需要自己定义变量。
- facts:ansible 自动采集远程主机系统信息(IP、磁盘、网卡)
- 默认开启收集;gather_facts: no关闭,加快执行
- 取值:ansible_facts'default_ipv4''address'
- 子集收集:setup模块gather_subset只取部分信息
- 自定义事实:被控机/etc/ansible/facts.d/下放.fact文件,支持 INI/JSON,不支持 YAML

魔法变量(内置,不用采集)
- hostvars:读取其他主机变量
- inventory_hostname:inventory 清单里的主机名
三、核心考点速记(做题用)
- 变量优先级:命令行‑e 最高,覆盖其他所有变量
- host_vars、group_vars目录,一个文件对应一台主机 / 一个组,是规范写法
- vault:加密整个文件,运行需要--ask‑vault‑pass输入解密密码
- facts 是远程主机系统信息,默认自动收集;gather_facts:no关闭收集提速
- 自定义事实放 /etc/ansible/facts.d/,后缀.fact,不支持 YAML 格式
- 魔法变量hostvars,可以在 A 机器的 playbook 里面读取 B 机器的变量。
容易混淆区分
- 普通变量:人自己写的
- facts 事实:Ansible 自动从远程机器抓取系统信息
- 魔法变量:Ansible 内置,不需要收集,直接可用