Ansible Playbook 中的“环境变量”实为作用域不同的变量:全局变量(vars)、任务级变量(environment)、命令行传参(-e)和主机/组变量(Inventory),分别用于跨任务、单任务、动态覆盖和按目标区分配置。

在 Ansible Playbook 中,“环境变量”不是指 Linux shell 的 ENV,而是指 Ansible 自身用于控制行为或传递配置的**变量(variables)**。Ansible 没有原生的“环境变量”概念,但可通过不同作用域的变量实现类似效果——比如全局生效的配置、仅单个任务使用的临时值。
全局变量:整个 Playbook 都能用
全局变量通常定义在 Play 层级,使用 vars 关键字,对当前 Play 内所有任务可见:
-
定义位置:写在
- hosts:下方、tasks:上方,顶格缩进(YAML 要求) - 支持类型:字符串、数字、布尔值、列表、嵌套字典都可直接写
-
调用方式:用双大括号
{{ var_name }},前后建议留空格,如"{{ app_port }}"
示例:
---
- hosts: webservers
vars:
app_name: nginx
http_port: 80
ssl_enabled: true
config_paths:
- /etc/nginx/nginx.conf
- /etc/nginx/conf.d/
tasks:
- name: Ensure nginx is installed
apt:
name: "{{ app_name }}"
state: present
<pre class="brush:php;toolbar:false;">- name: Start service
systemd:
name: "{{ app_name }}"
state: started
任务级变量:只在单个任务里有效
任务级变量不通过 vars 声明,而是直接在任务中内联定义,常见于 shell、command 或 environment 参数中:
-
临时环境变量:用
environment键为某个任务注入 Linux 运行时环境变量 - 仅限该任务使用:不影响其他任务,也不参与 Jinja2 变量渲染逻辑
-
可混合引用:
environment值里仍可使用{{ }}引用全局或主机变量
示例:
tasks:
- name: Run script with custom PATH and DEBUG flag
shell: ./deploy.sh
args:
executable: /bin/bash
environment:
PATH: "/opt/myapp/bin:/usr/local/bin:{{ ansible_env.PATH }}"
DEBUG: "1"
APP_ENV: "{{ app_name }}-staging"
命令行传参:覆盖一切的“最高优先级全局变量”
用 -e(--extra-vars)从终端传入的变量,作用范围是整个 Playbook,且优先级最高,会覆盖 Play、Inventory、文件等所有其他来源的同名变量:
ansible-playbook site.yml -e "env=prod" -e "db_host=10.0.2.10"- 也可加载外部 YAML 文件:
-e "@prod-vars.yml",适合密钥或大量配置 - 在 Playbook 中照常用
{{ env }}、{{ db_host }}引用
主机/组变量:按目标动态区分的“准全局”变量
在 Inventory 文件中定义的变量,按主机或主机组生效,属于“作用域明确的全局变量”:
- 主机变量写在主机行后,如:
web01 ansible_host=192.168.1.10 app_port=8080 - 主机组变量写在
[webservers:vars]段下,对组内所有主机生效 - 这些变量在 Play 中可直接引用,无需额外声明,也参与变量优先级排序
这类变量天然适配多环境(dev/test/prod),比硬编码更安全灵活。


















