在命令行中向 Ansible Playbook 传递变量值的最简单方法是使用 ansible-playbook 命令的 --extra-vars 参数。这种方法非常适合将 Ansible Playbook 与现有的自动化脚本或工具结合使用。
传递变量的方法
- 直接传递变量
使用
--extra-vars "variable=value"格式直接传递变量值。 示例:--extra-vars "fruit=apple" - 传递 JSON 格式的变量
使用
--extra-vars参数传递 JSON 格式的变量。 示例:--extra-vars '{"fruit":"apple"}' - 从文件中加载变量
使用
--extra-vars参数从 JSON 或 YAML 文件中加载变量。 示例:--extra-vars "@file.json"或--extra-vars "@file.yml"
示例:如何在命令行中向 Ansible Playbook 传递额外变量
Playbook 示例代码
---
- name: extra variable demo
hosts: all
vars:
fruit: "banana" # 默认值
tasks:
- name: print message
ansible.builtin.debug:
msg: "fruit is {{ fruit }}"
执行方式
-
直接传递变量
bash $ ansible-playbook --extra-vars="fruit=apple" -i virtualmachines/demo/inventory extra-variable/example.yml输出:
plaintext PLAY [extra variable demo] ********************************** TASK [Gathering Facts] ************************************** ok: [demo.example.com] TASK [message] *********************************************** ok: [demo.example.com] => { "msg": "fruit is apple" } PLAY RECAP *************************************************** demo.example.com : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 -
传递 JSON 格式的变量
bash $ ansible-playbook --extra-vars='{"fruit":"raspberry"}' -i virtualmachines/demo/inventory extra-variable/example.yml输出:
plaintext PLAY [extra variable demo] ********************************** TASK [Gathering Facts] ************************************** ok: [demo.example.com] TASK [message] *********************************************** ok: [demo.example.com] => { "msg": "fruit is raspberry" } PLAY RECAP *************************************************** demo.example.com : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 -
从文件中加载变量 假设
file.json文件内容为:json { "fruit": "orange" }执行命令:
bash $ ansible-playbook --extra-vars="@file.json" -i virtualmachines/demo/inventory extra-variable/example.yml输出:
plaintext PLAY [extra variable demo] ********************************** TASK [Gathering Facts] ************************************** ok: [demo.example.com] TASK [message] *********************************************** ok: [demo.example.com] => { "msg": "fruit is orange" } PLAY RECAP *************************************************** demo.example.com : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
注意事项
-
变量优先级 如果 Playbook 中已经定义了同名变量,通过
--extra-vars传递的变量值将覆盖 Playbook 中的默认值。 -
文件路径 使用
@file.json或@file.yml时,确保文件路径正确,且文件格式符合 JSON 或 YAML 规范。 -
环境变量 如果需要从环境变量中读取值,可以使用 Ansible 的
lookup插件,例如:yaml - name: print environment variable ansible.builtin.debug: msg: "HOME is {{ lookup('env', 'HOME') }}"
通过 --extra-vars 参数,你可以灵活地在命令行中向 Ansible Playbook 传递变量,从而实现动态配置和自动化任务的灵活性。