Ansible变量与事实

一、变量

核心作用

把会变的配置存起来,不用写死在 playbook 里,这样同一个 playbook 就能给测试、生产环境复用,不用改一堆地方。

必记:变量命名规则(别写错变量名)

  1. 必须以字母开头,不能用数字 / 下划线开头

  2. 只能有字母、数字、下划线,不能有空格、横杠、点

  3. 不能用 Python 的关键字(比如 if、for)

最容易忘的:变量优先级!

记忆小技巧:越临时、越靠近任务,优先级越高! 从低到高排,后面的会覆盖前面的:

  1. 清单里的组变量

  2. group_vars 目录的组变量

  3. 清单里的主机变量

  4. host_vars 目录的主机变量

  5. 主机事实

  6. play 里的 vars/vars_files 变量

  7. 任务里的变量

  8. 命令行的-e额外变量(最高!)

我之前踩过的坑:测试的时候加了-e临时改变量,后来忘了删,导致之后运行的时候变量一直不对,找了半天!

必记:引用变量必须加引号!

这个是我刚学的时候最常犯的错,不加引号 YAML 会把{``{ }}当成字典,直接语法报错!

复制代码
# 错的
name: {{ user }}
# 对的
name: "{{ user }}"

容易搞混的两种特殊变量

  1. 字典变量:把一组相关的配置打包,比如用户的所有信息,不用拆成一堆单独的变量

    复制代码
    user:
      name: joe
      home: /home/joe
    # 访问:user.name 或者 user['name']
  2. 注册变量:把任务的输出存起来,用来判断或者调试,比如装完包看结果

    复制代码
    - 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 看。

运行的时候怎么用加密文件?

两种方式:

  1. 手动输密码:加--vault-id @prompt,运行的时候输密码

  2. 用密码文件:加--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 会自动收集,但是要记住规则:

  1. 文件要放到/etc/ansible/facts.d/目录下

  2. 扩展名必须是.fact

  3. 格式只能是 INI 或者 JSON!不能用 YAML! 我之前踩过这个坑,写了 YAML 的文件,结果收集不到,搞了半天。

魔法变量:特殊的系统变量,常用的要记

  1. hostvars:拿其他主机的变量 / 事实,比如跨主机拿数据库的 IP,不用写死

  2. group_names:当前主机属于哪些组,用来判断给不同组的主机装不同的包

  3. groups:清单里所有的组和主机

  4. inventory_hostname:清单里的主机名,不是主机实际的主机名


四、注意

  1. 变量不生效:大概率是之前测试的-e参数忘了删,覆盖了变量

  2. 引用变量报错:忘了加引号,或者变量名写错了

  3. 加密文件打不开:密码输错了,或者用了多个密码没给对

  4. 自定义事实收集不到:用了 YAML 格式,或者放错目录了

  5. playbook 跑的慢:不知道可以关掉事实收集,或者只收集需要的子集


速查表

变量优先级速记

命令行-e > 任务变量 > play 变量 > 主机变量 > 组变量

Vault 命令速记

create 新建、view 查看、edit 编辑、encrypt 加密、rekey 改密码

常用事实速记

主机名、IP、系统类型、内存,这几个最常用

魔法变量速记

hostvars 跨主机、group_names 判断组

相关推荐
贺雷862 小时前
3. 远程访问Ubuntu
linux·运维·ubuntu
张小姐的猫2 小时前
【Linux】进程信号(质变)—— 信号捕捉 | 中断 | 内核态
linux·运维·服务器·c++
要做一个小太阳2 小时前
blockbox配置文件详解与优化
运维·网络·prometheus
一只鼠标猴2 小时前
甲方安全运营:漏洞整改推动实操指南
运维·安全·网络安全·安全架构·安全运营·漏洞整改
Tech_D2 小时前
RDM-A直线电机:高效精准,赋能机械升级
机器人·自动化·制造
DianSan_ERP2 小时前
淘宝订单接口集成中如何正确处理消费者敏感信息的安全与合规问题?
大数据·运维·网络·人工智能·安全·servlet
蚰蜒螟2 小时前
深入浅出:从JVM线程创建到Linux内核clone系统调用
linux·运维·jvm
IMPYLH2 小时前
Linux 的 sha256sum 命令
linux·运维·服务器·网络·bash·哈希算法
愚公搬代码2 小时前
【愚公系列】《OpenClaw实战指南》017-写作与整理:让OpenClaw 接管你的周报与公文(OpenClaw Skill调用详解)
人工智能·机器人·自动化·飞书·openclaw