Ansible 变量简介
Ansible 支持利用变量来存储值,并在 Ansible 项目的所有文件中重复使用这些值。这可以简化项目的创建和维护,并减少错误的数量。
通过变量,您可以轻松地在 Ansible 项目中管理给定环境的动态值。例如,变量可能包含下面这些值:
- 要创建的用户
- 要安装的软件包
- 要重新启动的服务
- 要删除的文件
- 要从互联网检索的存档
命名变量
变量的名称必须以字母开头,并且只能含有字母、数字和下划线。
定义变量
可在 Ansible 项目中的多个位置定义变量。如果在两个位置设置了同名变量,并且变量值不同,则通过优先级来决定要使用哪个值。
您可以设置会影响一组主机的变量,也可以设置只会影响个别主机的变量。有些变量是 Ansible 可以根据系统配置来设置的事实。还有些变量则可在 playbook 中设置,然后影响该 playbook 中的一个 play,或者仅影响该 play 中的一项任务。您还可通过--extra-vars或-e选项并指定变量值。
可在ansible‑navigator run命令行上设置额外变量,这些值将覆盖相应变量名称的所有其他值。
以下按优先级从低到高排列定义变量的方法:
- 在清单中定义的组变量
- 在清单或 playbook 所在目录的
group_vars子目录中定义的组变量 - 在清单中定义的主机变量
- 在清单或 playbook 所在目录的
host_vars子目录中定义的主机变量 - 在运行时中发现的主机事实
- playbook 中的 play 变量(
vars和vars_files) - 任务变量
- 在命令行中定义的额外变量
例如,设置为影响all主机组的变量会被设置为影响单个主机的同名变量覆盖。
建议选择全局唯一的变量名称,以避免考虑优先级规则。然而,有时您可能希望使用优先级来为不同的主机或主机组进行除默认设置以外的其他设置。
如果在多个级别上定义了相同名称的变量,则采用优先级别最高的变量。较窄范围(如主机变量或任务变量)优先于较宽范围(如组变量或 play 变量)。通过清单定义的变量将被 playbook 定义的变量覆盖。在命令行中使用--extra‑vars或-e选项定义的额外变量拥有最高优先级。
在 Playbook 中定义变量
编写 play 时,您可以定义自己的变量,然后在任务中调用这些值。例如,您可以使用值httpd来定义名为web_package的变量。然后,任务可以使用ansible.builtin.dnf模块调用该变量来安装 httpd 软件包。
您可以通过多种方式定义 playbook 变量。一种常见方式是将变量放在 play 开头的vars块中:
- hosts: all vars: user: joe home: /home/joe也可以在外部文件中定义 playbook 变量。此时不使用 playbook 的 play 中的 vars 块,可以改为使用vars_files指令,后面跟上相对于 playbook 位置的外部变量文件名称列表:
- hosts: all vars_files: - vars/users.yml而后,可以使用 YAML 格式在这些文件中定义 playbook 变量:
user: joe home: /home/joe在 Playbook 中使用变量
在声明了变量后,您可以在任务中使用变量。若要引用变量,可将变量名称放在双括号{{ }}内。在任务执行时,Ansible 会将变量替换为其值。
vars: user: joe tasks: # This line will read: Creates the user joe - name: Creates the user {{ user }} user: # This line will create the user named Joe name: "{{ user }}"