ansible template及变量获取、优先级
Jinja2 文档:https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_templating.html
Ansible 的 template
模块用于将 Jinja2 模板文件(.j2
文件)渲染并生成目标文件。它的主要功能是根据变量动态生成配置文件或其他内容,并将其分发到目标主机。template
模块在管理配置文件或生成动态内容时非常有用。
基本语法
- name: Render a template to a file ansible.builtin.template: src: template_file.j2 dest: /path/to/destination/file owner: root group: root mode: '0644'
主要参数
src
: 指定模板文件的路径。通常是相对于roles
或playbook
目录中的路径。dest
: 指定渲染后的文件保存路径。文件会被拷贝到目标主机上的这个路径。owner
: 设置生成文件的所有者。group
: 设置生成文件的所属组。mode
: 设置文件的权限模式(例如0644
)。
典型用法
1. 简单的模板渲染
- name: Render an nginx configuration file ansible.builtin.template: src: templates/nginx.conf.j2 dest: /etc/nginx/nginx.conf owner: root group: root mode: '0644'
这个任务会将 nginx.conf.j2
模板渲染并生成到目标主机的 /etc/nginx/nginx.conf
,文件的所有者和组为 root
,权限为 0644
。
2. 使用变量的模板渲染
假设在模板 nginx.conf.j2
中使用了一些变量,例如:
server { listen {{ nginx_port }}; server_name {{ nginx_server_name }}; location / { proxy_pass http://{{ proxy_backend }}; } }
在 playbook 中,可以定义这些变量,然后使用 template
模块来渲染模板:
- hosts: webservers vars: nginx_port: 80 nginx_server_name: example.com proxy_backend: backend.example.com tasks: - name: Render nginx configuration with variables ansible.builtin.template: src: templates/nginx.conf.j2 dest: /etc/nginx/nginx.conf
在目标主机上,nginx.conf
文件将会被渲染为:
server { listen 80; server_name example.com; location / { proxy_pass http://backend.example.com; } }
3. 使用 validate
参数
validate
参数用于在模板被渲染并写入目标文件前进行验证。常用于确保配置文件在部署前是有效的。例如,在渲染 nginx
配置文件时,可以使用 nginx -t
来验证:
- name: Render and validate nginx configuration ansible.builtin.template: src: templates/nginx.conf.j2 dest: /etc/nginx/nginx.conf validate: '/usr/sbin/nginx -t -c %s'
%s
: 会被替换为生成的文件路径。
如果验证失败,Ansible 会停止执行并报告错误,避免部署错误的配置文件。
template
和 copy
的区别
template
模块: 用于渲染 Jinja2 模板文件,允许在文件中使用变量、逻辑和控制结构。copy
模块: 用于直接复制文件,不进行任何模板渲染。
使用 template
模块的好处
- 动态生成文件: 根据上下文和变量动态生成配置文件或其他内容。
- 逻辑控制: 可以在模板中使用 Jinja2 语法,进行条件判断、循环等复杂操作。
- 配置管理: 更灵活地管理和部署不同环境下的配置文件。
Ansible 变量优先级(高 → 低)
优先级 | 变量来源 |
---|---|
🔥 1 | 任务级 (vars ) |
🚀 2 | vars_files (vars.yaml ) |
🎯 3 | include_vars |
⚡ 4 | set_fact (动态变量) |
🔗 5 | host_vars |
📦 6 | group_vars |
📋 7 | Playbook 级 (vars ) |
🗂️ 8 | Inventory 变量 (inventory.ini ) |
📁 9 | 角色 (roles/vars ) |
🛑 10 | 角色默认变量 (roles/defaults ) |
- 任务级 (
vars
) >set_fact
>host_vars
>group_vars
>inventory
>roles
- 尽量使用
host_vars
或group_vars
代替inventory
变量
tasks
级别定义的 vars
最高优先级。
- name: 任务级变量 ansible.builtin.template: src: myconfig.j2 dest: /etc/myconfig.conf vars: my_var: "task_level_value"
2. 变量文件 (vars_files
)
- name: 载入变量文件 hosts: all vars_files: - vars.yaml tasks: - name: 复制模板 ansible.builtin.template: src: myconfig.j2 dest: /etc/myconfig.conf
3.include_vars
模块
include_vars
允许在 tasks
中动态加载变量,比 vars_files
更灵活。
- name: 载入变量
ansible.builtin.include_vars:
file: vars.yaml
→ 该变量在 tasks
级别生效,比 vars_files
更优先!
4.set_fact
(动态变量)
set_fact
允许在 playbook 运行时创建变量,比 host_vars
、group_vars
级别更高。
- name: 设置动态变量 ansible.builtin.set_fact: my_var: "dynamic_value"
→ 该变量会覆盖 host_vars
、group_vars
中的 my_var
。
5. 主机级变量 (host_vars
)
# 在 inventory 目录下的 `host_vars/web-server.yaml` my_var: "host_specific_value"
6. 组级变量 (group_vars
)
group_vars
用于给组内所有主机指定变量,优先级低于 host_vars
。
# 在 inventory 目录下的 `group_vars/web.yaml` my_var: "group_value"
7. playbook全局vars
vars
定义在 playbook
级别,优先级低于 vars_files
和 host_vars
。
- name: Playbook 级变量 hosts: all vars: my_var: "playbook_level_value"
在 inventory
文件中定义的变量,优先级低于 group_vars
。
[web] web1 ansible_host=192.168.1.10 my_var="inventory_value"
9. 角色 (roles
) 变量
在 roles/rolename/vars/main.yml
中定义的变量,优先级低于 inventory
变量。
# roles/nginx/vars/main.yml my_var: "role_vars_value"
10. 角色默认变量 (roles/defaults
)
角色的默认变量优先级最低,可以被任何更高级的变量覆盖。
# roles/nginx/defaults/main.yml my_var: "default_value"
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
2022-08-23 linux备份数据加上时间戳
2022-08-23 Windows 定时清理文件并清空回收站