系列文章
Ansible 介绍和架构
Ansible 安装和入门
配置控制机器和受控机器
Inventory文件介绍
Ansible核心工具介绍
Ansible常用模块介绍与演示
Playbook 的基本概念
Playbook 的使用实例
目录
- 系列文章
- 定义变量
-
- [在 Playbook 中定义](#在 Playbook 中定义)
- [在 Inventory 文件中定义](#在 Inventory 文件中定义)
- 通过命令行传递
- 变量的作用域
-
- 全局变量 (Global Scope)
- [Play 变量 (Play Scope)](#Play 变量 (Play Scope))
- 主机变量 (Host Scope)
- 任务变量 (Task Scope)
- [Block 变量 (Block Scope)](#Block 变量 (Block Scope))
- 内置变量 (System Variables)
- 使用变量
- 变量的优先级
定义变量
在 Playbook 中定义
可以在 Playbook 的 Play 层次中定义变量,使用 vars
关键字:
yaml
---
- name: Example Play
hosts: all
vars:
app_name: myapp
app_port: 8080
tasks:
- name: Print application details
debug:
msg: "Application Name: {{ app_name }}, Port: {{ app_port }}"
- 在这个例子中,我们在 Play 层次定义了两个变量 app_name 和 app_port,并在任务中使用它们。
- 通过
{``{ variable_name }}
调用变量,且变量名前后建议加空格
在 Inventory 文件中定义
还可以在 Inventory 文件中定义变量:
yaml
[webservers]
web01 ansible_host=192.168.1.101 ansible_user=root app_name=myapp app_port=8080
- 这里,我们在 Inventory 文件中为 web01 主机定义了 app_name 和 app_port 变量。
通过命令行传递
以在执行 Playbook 时通过命令行参数传递变量:
bash
ansible-playbook playbook.yml -e "app_name=myapp" -e "app_port=8080"
- 这里,我们使用
-e
参数在命令行中传递了 app_name 和 app_port 变量。
变量的作用域
全局变量 (Global Scope)
全局变量是在命令行或 Ansible 配置文件中定义的变量,它们在整个 Playbook 执行过程中都可用。
bash
ansible-playbook playbook.yml -e "app_name=myapp" -e "app_port=8080"
Play 变量 (Play Scope)
Play 变量是在 Play 层次中定义的变量,它们在整个 Play 的执行过程中都可用。
yaml
---
- name: Example Play
hosts: all
vars:
app_name: myapp
app_port: 8080
主机变量 (Host Scope)
主机变量是在 Inventory 文件中为特定主机或主机组定义的变量。
Ini
[webservers]
web01 ansible_host=192.168.1.101 ansible_user=root app_name=myapp app_port=8080
任务变量 (Task Scope)
任务变量是在特定任务中定义的变量,它们只在当前任务中可用。
yaml
- name: Set a task variable
set_fact:
task_variable: "Value of task variable"
- name: Use the task variable
debug:
msg: "Task variable value: {{ task_variable }}"
set_fact
: 这个模块用于在任务执行期间设置变量。- 在第二个任务中,我们使用了
debug
模块来输出一条消息,其中包含task_variable
的值。这里我们使用了双大括号{``{ }}
来引用 task_variable 变量。当 Ansible 解释这条指令时,它会替换双大括号中的变量值
Block 变量 (Block Scope)
Block 变量是在 block 结构中定义的变量,它们只在当前 block 内可用。
yaml
- name: Define variables in a block
block:
- name: Set a block variable
set_fact:
block_variable: "Value of block variable"
- name: Use the block variable
debug:
msg: "Block variable value: {{ block_variable }}"
内置变量 (System Variables)
Ansible 自带了一系列内置变量,用于提供关于目标主机的信息。
yaml
- name: Display hostname
debug:
msg: "Hostname: {{ ansible_hostname }}"
使用变量
一旦定义了变量,你可以在 Playbook 的任务中使用双大括号 {``{ }}
来引用它们。
yaml
- name: Print application details
debug:
msg: "Application Name: {{ app_name }}, Port: {{ app_port }}"
这里有一个综合示例,展示了如何在 Playbook 中使用不同作用域的变量:
yaml
---
- name: Example Playbook
hosts: webservers
vars:
app_name: myapp
app_port: 8080
vars_files:
- vars/secrets.yml
tasks:
- name: Print application details
debug:
msg: "Application Name: {{ app_name }}, Port: {{ app_port }}, Secret: {{ secret_key }}"
- name: Set a task variable
set_fact:
task_variable: "Value of task variable"
- name: Use the task variable
debug:
msg: "Task variable value: {{ task_variable }}"
在这个例子中,我们定义了 Play 变量 app_name 和 app_port,使用了 vars_files 来包含外部变量文件 secrets.yml,并且在任务中设置了任务变量 task_variable 并使用它。
变量的优先级
如果在多个地方定义了同名的变量,那么 Ansible 会按照以下顺序确定最终使用的变量值:
- 命令行变量 (-e 或 --extra-vars) >
- Play 变量 (vars 在 Play 中定义) >
- 角色变量 (vars 在 Role 中定义) >
- 主机变量 (Inventory 文件中定义) >
- 默认变量 (default 在 Play 或 Role 中定义)