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_name
和user_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" |
适合变量多、结构复杂的情况 |
根据实际场景选择合适的方式即可。如果变量较多,建议使用文件方式,便于维护和复用。