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"
本文来自博客园,作者:不会跳舞的胖子,转载请注明原文链接:https://www.cnblogs.com/rtnb/p/18375141

浙公网安备 33010602011771号