1. 概述

Ansible 是一个流行的自动化工具,广泛用于自动化部署、配置管理等任务。由于同一个 Playbook任务 可能在不同环境中运行,我们通常需要通过变量来区分这些环境。例如,使用同一个 Playbook 对多个服务器打补丁时,可以通过变量来区分服务器名称。

一种常见的变量传递方式是通过命令行。本文将介绍如何在命令行中向 Ansible Playbook 传递变量。示例中使用的 Ansible 版本为 2.12.0。


2. 示例 Playbook

我们使用如下 Playbook 文件 example_playbook.yml

- hosts: localhost
  name: Example Ansible Playbook
  vars:
    user_name: '{{ firstname }}'
    user_surname: '{{ surname }}'
  tasks:
    - name: Print message
      debug:
        msg: Hello {{ user_name }} {{ user_surname }}

这个 Playbook 只有一个任务,用于输出一条问候语,格式为 Hello {{ user_name }} {{ user_surname }}。该任务使用了 Ansible 内置的 debug 模块。

其中:

  • user_nameuser_surname 是在 vars 中定义的变量。
  • user_name 的值来自另一个变量 firstname
  • user_surname 的值来自变量 surname

我们将通过命令行为这两个变量赋值。

使用的 inventory 文件 inventory 内容如下:

localhost ansible_connection=local

仅包含本地主机。


3. 使用 -e 参数传递变量

Ansible 提供了 -e--extra-vars 参数,允许我们从命令行向 Playbook 传递变量

-e 支持多种格式传递变量,下面分别介绍。

3.1. 使用 Key-Value 格式

这是最直接的一种方式,格式如下:

ansible-playbook -i inventory example_playbook.yml -e "firstname=John surname=Doe"

输出如下:

PLAY [Example Ansible Playbook] ********************************************************************************************************
 
TASK [Gathering Facts] *****************************************************************************************************************
ok: [localhost]
 
TASK [Print message] *******************************************************************************************************************
ok: [localhost] => {
    "msg": "Hello John Doe" 
} 

PLAY RECAP *****************************************************************************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

✅ 说明:

  • -i 指定 inventory 文件。
  • -e 后接变量,多个变量之间用空格分隔。
  • 也可以使用多个 -e 分别传递变量:
ansible-playbook -i inventory example_playbook.yml -e firstname=John -e surname=Doe

输出结果一致。

3.2. 使用 JSON 格式

也可以使用 JSON 格式传递变量:

ansible-playbook -i inventory example_playbook.yml -e '{"firstname":"John", "surname":"Doe"}'

这种方式适合传递结构较复杂的变量,比如嵌套对象。

3.3. 使用 JSON 或 YAML 文件

如果变量较多,推荐将变量写入一个文件中,再通过 -e 引用该文件。

示例文件内容如下:

variables.json

{
  "firstname": "John",
  "surname": "Doe"
}

variables.yml

firstname: "John"
surname: "Doe"

然后使用如下命令运行 Playbook:

ansible-playbook -i inventory example_playbook.yml -e "@variables.json"
ansible-playbook -i inventory example_playbook.yml -e "@variables.yml"

⚠️ 注意:文件名前必须加上 @ 符号。

✅ 优点:

  • 更清晰,易于维护
  • 适合大量变量或结构化数据

4. 小结

本文介绍了如何通过命令行向 Ansible Playbook 传递变量,主要使用的是 ansible-playbook 命令的 -e 参数。

总结一下 -e 的使用方式:

方式 示例 说明
Key-Value -e "firstname=John surname=Doe" 简洁明了,适合少量变量
JSON 字符串 -e '{"firstname":"John", "surname":"Doe"}' 支持复杂结构
JSON/YAML 文件 -e "@variables.json" 适合变量多、结构复杂的情况

根据实际场景选择合适的方式即可。如果变量较多,建议使用文件方式,便于维护和复用。


原始标题:Passing Variables to an Ansible Playbook From the Command Line