Ansible变量、机密与事实管理解析

一、 管理变量 (Managing Variables)

变量用于存储和引用数据,使 Playbook 更具动态性和可重用性。

  1. 变量的定义与设置

Playbook 变量 (vars): 在 Playbook 或 Play 的 vars 部分直接定义。

主机和组变量: 在 inventory 文件或 host_vars/ 和 group_vars/ 目录中定义,专门用于特定主机或主机组。这是最常用的方式之一。

group_vars/all.yml (适用于所有主机)

group_vars/dbservers.yml (适用于 dbservers 组)

host_vars/server01.example.com.yml (适用于特定主机)

2.变量的引用

使用 Jinja2 语法 {{ variable_name }} 引用变量.

引用字典变量可以使用点号或方括号:{{ user.name }} 或 {{ user['name'] }}。

  1. 变量的优先级 (Variable Precedence)

Ansible 变量来源广泛,其加载顺序(即优先级)至关重要。高优先级的变量会覆盖低优先级的同名变量。

从高到低的关键优先级示例:

命令行显式传递 (-e):ansible-playbook site.yml -e "http_port=8080"

Playbook 中的 vars 块

主机变量 (host_vars)

组变量 (group_vars)

Inventory 变量 (在 inventory 文件中定义)

Role 默认变量 (在 role 的 defaults/main.yml 中定义) - 这是优先级最低的。

核心要点: 理解优先级可以避免变量被意外覆盖,并知道在哪里定义变量最合适(例如,机密信息用 -e 传递,通用配置放在 group_vars,角色默认值放在 defaults)。

二、 管理机密 (Managing Secrets) - Ansible Vault

用于加密和保护敏感数据,如密码、API 密钥、证书等。

  1. 核心工具:ansible-vault 命令

创建加密文件: ansible-vault create secrets.yml (会提示输入密码)

加密现有文件: anssible-vault encrypt secrets.yml

查看加密文件: ansible-vault view secrets.yml

编辑加密文件: ansible-vault edit secrets.yml

解密文件: ansible-vault decrypt secrets.yml

  1. 在 Playbook 中使用加密变量

最常见的方式是创建一个加密的变量文件(如 vars/vault.yml 或 group_vars/all/vault.yml),然后在 Playbook 或其它变量文件中通过 vars_files 引入。

  1. 运行使用 Vault 的 Playbook

运行时提供密码:

交互式: ansible-playbook site.yml --ask-vault-pass

通过密码文件 (非交互式,用于自动化): ansible-playbook site.yml --vault-password-file vault_pass.txt

最佳实践: 将密码文件权限设置为 600,并使用安全的秘密管理工具(如 ssh-agent, gpg)来保护密码文件本身。

三、 管理事实 (Managing Facts)

事实是 Ansible 从受管节点自动发现的系统信息。

  1. 使用 Ansible 事实 (Gathering Facts)

默认行为: Play 开始时第一个自动执行的任务就是 Gathering Facts。

引用事实: 事实是预定义的变量,可以直接在任务或模板中使用。所有事实都存储在 ansible_facts 字典中,常用的也有快捷方式。

  1. 常用事实类别:

网络: ansible_facts.default_ipv4.address (主IP地址)

系统: ansible_facts.distribution (发行版名称), ansible_facts.memtotal_mb (总内存)

硬件: ansible_facts.devices (设备列表), ansible_facts.processor_vcpus (CPU核心数)

  1. 配置自定义事实 (Custom Facts)

概念: 用户可以在受管节点上定义自己的静态或动态变量,Ansible 会像收集系统事实一样收集它们。