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 判断组

相关推荐
林间码客2 小时前
从DevOps到DevSecOps:构建现代软件交付的基石与护城河
大数据·运维·devsecops·devops
Lust Dusk3 小时前
记一次Linux应急响应题目解析
linux·运维·服务器·网络·安全·网络安全
智塑未来3 小时前
发那科又叫法兰克?译名误区拆解,数控自动化龙头全维度解析
大数据·人工智能·自动化
轻揉小乔 真新人4 小时前
使用memc-nginx和srcache-nginx模块构建高效透明的缓存机制
运维·nginx·缓存
Yan_chen6665 小时前
SSH(Secure Shell)安全外壳协议详解
运维·网络协议·ssh
数据知道5 小时前
SQL 注入从入门到精通:手工注入 + sqlmap 自动化
网络·数据库·sql·网络安全·自动化
lingran__6 小时前
Linux 基础常用指令万字详解(上)|文件目录命令,结合底层原理剖析
linux·运维·服务器·后端·centos·linux基础指令
张小泡泡6 小时前
AUTO_EVAL:面向大语言模型的多层次自动化评测框架
论文阅读·人工智能·语言模型·自然语言处理·自动化·微调
mengpp_1234566 小时前
泵站自动化控制系统:数据安全管控,筑牢水务运行防护墙
物联网·自动化·iot
各类产品分享7 小时前
电力行业AR智能运维哪个品牌好
运维·ar·ar巡检