在本章中,我将为您介绍 Ansible 变量是什么,为什么需要它们,它们的不同类型,以及如何在日常工作中编辑和使用它们。
Ansible 变量的作用
- 变量用于存储动态值 在 Playbook 中,使用变量来存储所有需要的动态值是一种良好的实践。通过编辑变量,您可以在未来根据业务需求对代码进行参数化,从而重复使用代码。
不允许的变量名称
- 不允许包含空格:
my var - 不允许包含点号:
my.var - 不允许以数字开头:
1stvar - 不允许包含特殊字符:
myvar$1
Ansible 允许变量名称中使用字母和数字的组合,但不能以数字开头,这是信息技术领域的一个通用规则。变量名称的四个主要限制是:不允许空格、不允许点号、不能以数字开头、不能包含特殊字符。右侧是一些无效变量名称的示例。
示例:变量打印 Playbook
文件名:variableprint.yml
---
- name: Variable print sample
hosts: all
vars:
fruit: "apple"
tasks:
- name: Print variable
ansible.builtin.debug:
msg: "Print the value of variable {{ fruit }}"
- 文件名:
variableprint.yml - Playbook 名称:Variable print sample
- 执行目标主机:所有主机(
all) - 任务列表:一个名为“Print variable”的任务
- 模块:
debug - 模块参数:
msg参数的值为“Print the value of variable”与变量fruit的值拼接。
“variableprint.yml” Playbook 与 “helloworld.yml” 类似,区别在于引入了变量 fruit。变量用于存储信息,如字符串、数字以及更复杂的数据结构(如列表、字典等)。在此示例中,变量名为 fruit,值为 “apple”。debug 模块将字符串 “Print the value of variable” 与变量 fruit 的值拼接。请注意双大括号 {{ }} 表示变量的值,建议始终在代码中将双大括号放在双引号内。
执行示例
$ ansible-playbook -i inventory variableprint.yml
执行结果与 “helloworld.yml” 类似,输出为 “Print the value of variable apple”,将字符串与变量值拼接。此执行成功,如您在执行总结区域看到的绿色输出所示,共执行了两个任务。
从命令行覆盖变量
$ ansible-playbook -i inventory -e fruit=banana variableprint.yml
您可以通过命令行指定变量的值来覆盖 Playbook 中的变量。命令行中设置的变量称为额外变量(extra variables)。此执行的输出与上一个类似,但变量值被覆盖为 “banana”,输出为 “Print the value of variable banana”。
主机变量和组变量
在清单文件中定义变量
主机变量示例:
[servers]
host1.example.com ansible_user=devops
组变量示例:
[servers]
host1.example.com
host2.example.com
[servers:vars]
user=alice
您可以在清单文件中定义主机变量和组变量。左侧示例中,ansible_user 变量被赋值为 “devops”,该主机变量适用于 host1.example.com。右侧示例中,user 变量被赋值为 “alice”,该组变量适用于 host1.example.com 和 host2.example.com。
使用目录定义变量
主机变量目录示例:
[servers]
host1.example.com
host_vars/demo1.example.com 文件内容:
ansible_user=devops
组变量目录示例:
[servers]
host1.example.com
host2.example.com
group_vars/servers 文件内容:
user=alice
您也可以通过目录来定义主机和组变量。左侧示例中,ansible_user 变量被赋值为 “devops”,适用于 host1.example.com。右侧示例中,user 变量被赋值为 “alice”,适用于 host1.example.com 和 host2.example.com。
数组变量
文件名:array.yml
---
- name: Array sample
hosts: all
vars:
users:
alice:
firstname: Alice
homedir: /users/alice
bob:
firstname: Bob
homedir: /users/bob
tasks:
- name: Print Alice's firstname
ansible.builtin.debug:
msg: "Print Alice's firstname: {{ users.alice.firstname }}"
- 文件名:
array.yml - 用户数据结构:用户以层次化数据结构组织。
- 访问方式:可以通过点符号(
.)或方括号([])访问数据。
数组是一种非常有用的数据结构,可以将信息组织成层次化的数据结构。在示例中,用户列表(alice 和 bob)清晰可见,每个用户有两个属性:firstname 和 homedir。您可以使用点符号或方括号访问数据,两种方式的结果相同。
执行示例
$ ansible-playbook -i inventory array.yml
执行结果与之前类似,输出为 “Print Alice’s firstname: Alice”。Ansible 访问了数组变量的值,并按预期在输出消息中显示。
注册变量
文件名:registeredvariables.yml
---
- name: Installs a package and prints the result
hosts: all
become: true
tasks:
- name: Install the package
ansible.builtin.yum:
name: wget
state: installed
register: install_result
- name: debug
ansible.builtin.debug:
var: install_result
- 文件名:
registeredvariables.yml - 注册变量:将命令的输出存储到变量
install_result中,并在屏幕上打印。
注册变量是另一种非常有用的数据结构,可以将任何命令的输出保存到变量中。此示例将在屏幕上打印输出。
执行示例
$ ansible-playbook -i inventory registeredvariables.yml
执行结果如预期,yum 模块首先检查软件包是否存在,如果不存在则进行安装。安装过程的输出被存储在注册变量中,并在屏幕上打印。
总结
在本章中,我们探索了 Ansible Playbook 中变量的使用,包括用户自定义变量、主机变量、组变量和注册变量。