Ansible 变量详解
在 Ansible 中,变量是用于存储和重用数据的关键组件。它们可以帮助简化任务定义,使 Playbook 更具可读性和灵活性。本文将详细介绍 Ansible 变量的命名规则、作用域、定义方法以及使用方式。
1. 变量命名规则
变量的名称必须遵循以下规则:
- 必须以字母开头。
- 只能包含字母、数字和下划线。
无效的变量名称 | 有效的变量名称 |
---|---|
web server | web_server |
remote.file | remote_file |
1st file | file_1 |
remoteserver$1 | remote_server_1 |
例如,在 CentOS 上定义有效的变量名:
- name: 设置变量示例
hosts: all
vars:
web_server: "nginx"
db_server: "postgresql"
2. 变量的作用域
Ansible 中的变量可以定义在不同的范围内,每个范围的优先级不同。变量的范围包括:
- 全局范围:从命令行或 Ansible 配置文件中设置的变量。
- Play 范围:在 play 和相关结构中设置的变量。
- 主机范围:由清单(inventory)、事实收集(facts)或注册的任务(register)定义的变量。
变量优先级:命令行 > play 范围 > 主机范围
3. Playbook 中定义变量
方法一:在 Playbook 开头的 vars
块中定义变量
- hosts: all
vars:
user: "alice"
home: "/home/alice"
方法二:通过 vars_files
指令指定外部文件,在外部文件中定义变量
创建一个外部文件 users.yml
:
user: "bob"
home: "/home/bob"
在 Playbook 中引用外部文件:
- hosts: all
vars_files:
- vars/users.yml
4. Playbook 文件中使用变量
定义的变量可以在 Playbook 中使用双大括号 {{ }}
进行引用。Ansible 在任务执行时会将变量替换为相应的值。
- name: 安装并启动 Apache 服务
hosts: web
vars:
web_pkg: "httpd"
firewall_pkg: "firewalld"
web_service: "httpd"
firewall_service: "firewalld"
rule: "http"
tasks:
- name: 安装软件包
yum:
name: "{{ web_pkg }}"
state: latest
- name: 启动并启用防火墙服务
service:
name: "{{ firewall_service }}"
enabled: true
state: started
- name: 启动并启用 Web 服务
service:
name: "{{ web_service }}"
enabled: true
state: started
5. 数组变量定义
可以将变量定义为数组,以便更好地组织和管理数据。
定义数组变量
users:
alice:
first_name: "Alice"
last_name: "Smith"
home_dir: "/home/alice"
bob:
first_name: "Bob"
last_name: "Johnson"
home_dir: "/home/bob"
访问数组变量
可以使用以下方法访问用户数据:
# 返回 'Alice'
users.alice.first_name
# 返回 '/home/bob'
users.bob.home_dir
由于变量被定义为 Python 字典,可以使用替代语法:
# 返回 'Alice'
users['alice']['first_name']
# 返回 '/home/bob'
users['bob']['home_dir']
6. register 变量注册和使用
使用 register 注册变量
在任务中使用 register
关键字将命令的输出结果存储到一个变量中。
- name: 安装软件包并输出结果
hosts: web
tasks:
- name: 安装 httpd 包
yum:
name: "httpd"
state: present
register: install_result
- debug:
var: install_result
运行结果
执行上述 Playbook 后,install_result
变量将包含有关软件包安装的详细信息。可以使用 debug
模块输出变量的内容以供检查和调试。
TASK [安装 httpd 包] *****************************************
ok: [192.168.31.81] => {
"install_result": {
"changed": false,
"failed": false,
"msg": "Nothing to do",
"rc": 0,
"results": []
}
}
本文由mdnice多平台发布
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。