Logo
Section 1 / 6

变量基础

学习如何使用变量在 Ansible 中引入可重用性。

导入

变量基础

学习如何使用变量在 Ansible 中引入可重用性。

概述

使用变量为我们提供了配置管理项目所需的灵活性。变量是 Ansible playbook 和角色中的关键组成部分,使我们能够参数化任务,从而创建动态、灵活且可复用的配置。

通过变量来参数化任务,可以使我们的 playbook 和角色不仅具备适应性,还更易于维护。我们不再将值硬编码到任务中,而是使用变量集中管理那些经常变化的配置部分。

以下是一个使用相关变量(如 web_server_port、web_server_document_root、APACHE_LOG_DIR 和 web_server_index_file)的 Apache 虚拟主机配置示例,以保持配置的动态性:

1# apache.conf 2 3<VirtualHost *:{{ web_server_port }}> 4 DocumentRoot {{ web_server_document_root }} 5 <Directory {{ web_server_document_root }}> 6 Options Indexes FollowSymLinks 7 AllowOverride None 8 Require all granted 9 </Directory> 10 11 ErrorLog ${APACHE_LOG_DIR}/error.log 12 CustomLog ${APACHE_LOG_DIR}/access.log combined 13 14 DirectoryIndex {{ web_server_index_file }} 15</VirtualHost>

在 apache.conf 配置文件中,变量通过 {{ }} 或 ${ } 引用,其值可以在 playbook 中定义,或在单独的变量文件中指定。

变量命名

变量名称只能由字母、数字和下划线组成。变量名通常以字母或下划线开头。有一些保留字不应作为变量名使用,例如 tasks、yield、with、timeout 等。以下是一些变量定义示例:

1application_name: "my_app" 2app_version: "1.2"

上述示例展示了两个符合命名规范的变量:application_name 和 app_version。

变量作用域

变量作用域指的是变量被定义的上下文以及其可访问的范围。根据作用域的不同,Ansible 的变量可分为以下几类:

  • 全局变量:提供跨所有主机和组的通用配置设置。适用于需要在所有主机上保持一致的参数。全局变量通常定义在 playbook 顶层目录的 vars 子文件夹下的 main.yml 文件中。

  • 剧本变量:在 playbook 内部定义。例如,在配置 Web 服务器的 playbook 中,可以使用剧本变量来指定所需参数(如 web_server_port 或 web_server_document_root)。

  • 主机变量:针对特定主机定义,存储在主机清单文件或 group_vars/host_vars 目录中。主机变量允许为基础设施中的每个主机定义特定配置。

理解变量优先级层次

变量可以被覆盖、合并和继承,其作用域决定了它们的可访问性。越具体的变量优先级越高:主机变量的优先级高于剧本变量,剧本变量高于全局变量;但通过 -e 传入的额外变量优先级最高,会覆盖以上所有变量。

变量优先级顺序如下:

  • 角色的 defaults 目录:在角色的 defaults 目录中定义的变量优先级最低,作为基础配置。
  • 库存变量:在库存文件或 group_vars/<目录> 中定义的主机和组变量可以覆盖角色默认值。
  • 剧本变量:在 playbook 本身中定义的变量(包括 vars 部分)可以进一步覆盖库存变量。
  • 额外变量:可以通过命令行使用 -e 参数传递额外变量,这些变量具有最高优先级,覆盖所有其他已定义的变量。

最佳实践

以下是使用变量时的一些实用建议:

  • group_vars 和 host_vars 文件应仅用于定义与主机或组相关的特定变量。
  • 不应在清单文件(如 hosts 文件)中定义不必要的变量。
  • 与某个角色相关的变量必须定义在该角色的 defaults 目录下的 main.yml 文件中。
  • 当使用 -e 参数执行 playbook 时,需提供相应变量的实际值。
  • 所有 playbook 共享的通用变量应添加到 group_vars/all 中。
  • 变量名称应清晰明了,能准确反映其用途。

Ansible 中的主要概念

使用变量