在命令行中向 Ansible Playbook 传递变量值的最简单方法是使用 ansible-playbook 命令的 --extra-vars 参数。这种方法非常适合将 Ansible Playbook 与现有的自动化脚本或工具结合使用。

传递变量的方法

  1. 直接传递变量 使用 --extra-vars "variable=value" 格式直接传递变量值。 示例:--extra-vars "fruit=apple"
  2. 传递 JSON 格式的变量 使用 --extra-vars 参数传递 JSON 格式的变量。 示例:--extra-vars '{"fruit":"apple"}'
  3. 从文件中加载变量 使用 --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 }}"

执行方式

  1. 直接传递变量

    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

  2. 传递 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

  3. 从文件中加载变量 假设 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

注意事项

  1. 变量优先级 如果 Playbook 中已经定义了同名变量,通过 --extra-vars 传递的变量值将覆盖 Playbook 中的默认值。

  2. 文件路径 使用 @file.json 或 @file.yml 时,确保文件路径正确,且文件格式符合 JSON 或 YAML 规范。

  3. 环境变量 如果需要从环境变量中读取值,可以使用 Ansible 的 lookup 插件,例如:

    yaml - name: print environment variable ansible.builtin.debug: msg: "HOME is {{ lookup('env', 'HOME') }}"

通过 --extra-vars 参数,你可以灵活地在命令行中向 Ansible Playbook 传递变量,从而实现动态配置和自动化任务的灵活性。