Ansible 支持利用变量来存储值,并在 Ansible 项目的所有文件中重复使用这些值,可以简化项目的创建和维护,并减少错误的数量。通过变量,您可以轻松管理给定环境的动态值。

定义变量

可以在以下位置定义变量,按优先级从低到高排列:

  • 在清单中定义的组变量。
  • 在清单或 Playbook 所在目录的 group_vars 子目录中定义的组变量。
  • 在清单中定义的主机变量。
  • 在清单或 Playbook 所在目录的 host_vars 子目录中定义的主机变量。
  • 在运行时中发现的主机事实。
  • (vars 和 vars_files)playbook 中的 Play 变量。
  • 任务变量。
  • 在命令行中定义的额外变量。

如果在多个级别上定义了相同名称的变量,则采用优先级别最高的变量。较窄范围(如主机变量或任务变量)优先于较宽范围(如组变量或 play 变量)。通过清单定义的变量将通过 playbook 定义的变量覆盖。在命令行中使用 --extra-vars 或 -e 选项定义的额外变量拥有最高优先级。

主机变量和组变量

有两种方式,一种是在清单文件里,另外一种使用目录

  1. 在清单文件中定义,主机变量直接放在主机后面,组变量放在块[groupname:vars]
    主机变量:
[servers]
demo.example.com  ansible_user=joe

组变量

[servers]
demo1.example.com
demo2.example.com

[servers:vars]
user=joe
  1. 使用目录
    在清单文件或者playbook文件的目录下创建group_vars或者host_vars 子目录,定义变量的文件名是组或者主机的名字(没有后缀),采用yaml格式,也可以用组或主机名作为第二级目录,其目录里包含的文件都会被组或者主机使用,文件名没有具体要求,这样普通信息用明文表示,敏感信息可以放在ansible-valt加密的文件里
    例如在一个场景中,需要管理两个数据中心,并在 ~/project/inventory 清单文件中定义数据中心主机:
$ cat ~/inventory
[westcenter]
demo1.example.com
demo2.example.com

[eastcenter]
demo3.example.com
demo4.example.com

[datacenters:children]
westcenter
eastcenter

如果需要为两个数据中心的所有服务器定义一个通用值,可以为 datacenters 主机组设置一个组变量

$ cat ~/group_vars/datacenters
package: httpd

也可以为不同的组和主机在单独的文件中定义他们的变量
示例的目录结构如果包含上面的组和主机所有变量文件,将如下所示:

├── ansible.cfg
├── group_vars
│ ├── datacenters
│ ├── eastcenters
│ └── westcenters
├── host_vars
│ ├── demo1.example.com
│ ├── demo2.example.com
│ ├── demo3.example.com
│ └── demo4.example.com
├── inventory
└── playbook.yml
Ansible 会查找与清单和 playbook 相对的 host_vars 和 group_vars 子目录。 如果您的清单和 playbook 恰好在同一目录中,则比较简单,Ansible 可以在相应目录中查找这两个子目录。如果您的清单和 playbook 在不同目录中,则 Ansible 需要从两个位置查找 host_vars 和 group_vars 子目录。playbook 子目录的优先级更高。

在 Playbook 中使用变量

若要引用变量,可将变量名称放在双花括号 ({{ }}) 内。

当变量用作开始一个值的第一元素时,必须使用引号。这可以防止 Ansible 将变量引用视为 YMAL 字典的开头

name: “{{ user }}”
msg: the user is {{ user }}

Ansible 会查找与清单和 playbook 相对的 host_vars 和 group_vars 子目录。 如果您的清单和 playbook 恰好在同一目录中,则比较简单,Ansible 可以在相应目录中查找这两个子目录。如果您的清单和 playbook 在不同目录中,则 Ansible 需要从两个位置查找 host_vars 和 group_vars 子目录。playbook 子目录的优先级更高。

register 变量

在task中用 register: var,可以把task的运行结果放到变量里,可以在以后引用, 最常用的使用setup收集主机fact,把fact的信息放到变量里,可以在后面的task里面使用

魔法变量


最常用的有四个:
hostvars
包含受管主机的变量,可以用于获取另一台受管主机的变量的值。如果还没有为受管主机收集事实,则它不会包含该主机的事实。

group_names
列出当前受管主机所属的所有组。

groups
列出清单中的所有组和主机。

inventory_hostname
包含清单中配置的当前受管主机的主机名称。这可能因为各种原因而与事实报告的主机名称不同。