在本章中,我将为您介绍 Ansible 变量是什么,为什么需要它们,它们的不同类型,以及如何在日常工作中编辑和使用它们。

Ansible 变量的作用

  1. 变量用于存储动态值 在 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 中变量的使用,包括用户自定义变量、主机变量、组变量和注册变量。