一、 管理变量 (Managing Variables)
变量用于存储和引用数据,使 Playbook 更具动态性和可重用性。
- 变量的定义与设置
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'] }}。
- 变量的优先级 (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 密钥、证书等。
- 核心工具: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
- 在 Playbook 中使用加密变量
最常见的方式是创建一个加密的变量文件(如 vars/vault.yml 或 group_vars/all/vault.yml),然后在 Playbook 或其它变量文件中通过 vars_files 引入。
- 运行使用 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 从受管节点自动发现的系统信息。
- 使用 Ansible 事实 (Gathering Facts)
默认行为: Play 开始时第一个自动执行的任务就是 Gathering Facts。
引用事实: 事实是预定义的变量,可以直接在任务或模板中使用。所有事实都存储在 ansible_facts 字典中,常用的也有快捷方式。
- 常用事实类别:
网络: ansible_facts.default_ipv4.address (主IP地址)
系统: ansible_facts.distribution (发行版名称), ansible_facts.memtotal_mb (总内存)
硬件: ansible_facts.devices (设备列表), ansible_facts.processor_vcpus (CPU核心数)
- 配置自定义事实 (Custom Facts)
概念: 用户可以在受管节点上定义自己的静态或动态变量,Ansible 会像收集系统事实一样收集它们。