一、变量
核心作用
把会变的配置存起来,不用写死在 playbook 里,这样同一个 playbook 就能给测试、生产环境复用,不用改一堆地方。
必记:变量命名规则(别写错变量名)
-
必须以字母开头,不能用数字 / 下划线开头
-
只能有字母、数字、下划线,不能有空格、横杠、点
-
不能用 Python 的关键字(比如 if、for)
最容易忘的:变量优先级!
记忆小技巧:越临时、越靠近任务,优先级越高! 从低到高排,后面的会覆盖前面的:
-
清单里的组变量
-
group_vars 目录的组变量
-
清单里的主机变量
-
host_vars 目录的主机变量
-
主机事实
-
play 里的 vars/vars_files 变量
-
任务里的变量
-
命令行的
-e额外变量(最高!)
我之前踩过的坑:测试的时候加了-e临时改变量,后来忘了删,导致之后运行的时候变量一直不对,找了半天!
必记:引用变量必须加引号!
这个是我刚学的时候最常犯的错,不加引号 YAML 会把{``{ }}当成字典,直接语法报错!
# 错的
name: {{ user }}
# 对的
name: "{{ user }}"
容易搞混的两种特殊变量
-
字典变量:把一组相关的配置打包,比如用户的所有信息,不用拆成一堆单独的变量
user: name: joe home: /home/joe # 访问:user.name 或者 user['name'] -
注册变量:把任务的输出存起来,用来判断或者调试,比如装完包看结果
- name: 装包 dnf: name=httpd register: install_result # 把输出存到这个变量里注册变量里有 rc(返回码)、stdout(输出)这些,用来判断任务有没有成功。
主机 / 组变量:推荐的目录管理法
现在不用把变量写在清单里了,太乱,推荐在项目里建两个目录:
-
group_vars/:放组变量,文件名和组名一样 -
host_vars/:放主机变量,文件名和主机名一样 这样结构清晰,找变量一眼就能找到。
二、Ansible Vault:敏感数据的保护,重点记命令
核心作用
把敏感的变量文件(密码、密钥)加密,这样就能放心存到 Git 里了,别人看不到明文。 重点:密码找不回来!忘了密码加密的文件就废了,一定要记好!
必记:常用命令,别搞混了
|-----------------------------|------------|-----------------|
| 命令 | 作用 | 注意点 |
| ansible-vault create 文件名 | 新建加密文件 | 输完密码就可以写内容了 |
| ansible-vault view 文件名 | 查看加密文件 | 只看不改,别用 edit 看! |
| ansible-vault edit 文件名 | 编辑加密文件 | 自动解密改完再加密 |
| ansible-vault encrypt 文件名 | 把明文文件转成加密的 | 可以批量加密 |
| ansible-vault rekey 文件名 | 改加密文件的密码 | 输旧密码改新的 |
我踩过的坑:之前用 edit 命令看文件,不小心改了内容还没发现,后来出问题了,现在只敢用 view 看。
运行的时候怎么用加密文件?
两种方式:
-
手动输密码:加
--vault-id @prompt,运行的时候输密码 -
用密码文件:加
--vault-password-file 密码文件,适合自动化用,注意密码文件权限要设成 600,别让别人看
三、事实:自动适配主机的核心,难点是自定义事实
核心作用
Ansible 自动帮你收集主机的系统信息(内存、系统、IP 这些),存成变量,你可以根据这些信息自动调整任务,比如 CentOS 用 dnf,Ubuntu 用 apt,不用手动写。
常用事实变量,速记
|-------|--------------------------------------------|
| 信息 | 变量写法 |
| 主机名 | ansible_facts['hostname'] |
| 主机 IP | ansible_facts['default_ipv4']['address'] |
| 系统类型 | ansible_facts['os_family'] |
| 总内存 | ansible_facts['memtotal_mb'] |
| 内核版本 | ansible_facts['kernel'] |
新旧写法:老的是ansible_kernel,新的是ansible_facts['kernel'],现在都兼容,但是推荐用新的。
什么时候关掉事实收集?
默认会自动收集,但是要花时间,如果有几十台主机就很慢。 如果不需要事实(比如只是重启个服务),就加gather_facts: no,能快很多! 我之前不知道这个,跑简单任务的时候等了半天,后来才知道可以关。
难点:自定义事实,容易忘规则
自己加的系统信息,比如自己应用的版本,Ansible 会自动收集,但是要记住规则:
-
文件要放到
/etc/ansible/facts.d/目录下 -
扩展名必须是
.fact -
格式只能是 INI 或者 JSON!不能用 YAML! 我之前踩过这个坑,写了 YAML 的文件,结果收集不到,搞了半天。
魔法变量:特殊的系统变量,常用的要记
-
hostvars:拿其他主机的变量 / 事实,比如跨主机拿数据库的 IP,不用写死 -
group_names:当前主机属于哪些组,用来判断给不同组的主机装不同的包 -
groups:清单里所有的组和主机 -
inventory_hostname:清单里的主机名,不是主机实际的主机名
四、注意
-
变量不生效:大概率是之前测试的
-e参数忘了删,覆盖了变量 -
引用变量报错:忘了加引号,或者变量名写错了
-
加密文件打不开:密码输错了,或者用了多个密码没给对
-
自定义事实收集不到:用了 YAML 格式,或者放错目录了
-
playbook 跑的慢:不知道可以关掉事实收集,或者只收集需要的子集
速查表
变量优先级速记
命令行-e > 任务变量 > play 变量 > 主机变量 > 组变量
Vault 命令速记
create 新建、view 查看、edit 编辑、encrypt 加密、rekey 改密码
常用事实速记
主机名、IP、系统类型、内存,这几个最常用
魔法变量速记
hostvars 跨主机、group_names 判断组