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: 指定模板文件的路径。通常是相对于 rolesplaybook 目录中的路径。
  • 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 会停止执行并报告错误,避免部署错误的配置文件。

templatecopy 的区别

  • 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_varsgroup_vars 代替 inventory 变量
1. 在 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_varsgroup_vars 级别更高。

- name: 设置动态变量
  ansible.builtin.set_fact:
    my_var: "dynamic_value"

→ 该变量会覆盖 host_varsgroup_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_fileshost_vars

- name: Playbook 级变量
  hosts: all
  vars:
    my_var: "playbook_level_value"
 8. Inventory 变量

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"

 

posted @   不会跳舞的胖子  阅读(132)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
历史上的今天:
2022-08-23 linux备份数据加上时间戳
2022-08-23 Windows 定时清理文件并清空回收站
点击右上角即可分享
微信分享提示