如何在 Ansible Playbook 的任务或 Play 级别设置环境变量并验证

在 Ansible 中,可以通过 environment 语句在任务或 Play 级别设置远程主机的环境变量。这些变量仅在 Ansible Playbook 的执行期间生效,不会永久修改远程主机的环境。

示例:在 Ansible Playbook 中设置环境变量

Playbook 文件:environment-remote.yml

---
- name: remote environment demo
  hosts: all
  gather_facts: false
  environment:
    EXAMPLE: test1
  tasks:
    - name: display EXAMPLE
      ansible.builtin.command: "echo $EXAMPLE"

    - name: display EXAMPLE with different value
      ansible.builtin.command: "echo $EXAMPLE"
      environment:
        EXAMPLE: test2

执行命令

$ ansible-playbook -i virtualmachines/demo/inventory ansible\ statements/environment-remote.yml -v

执行结果

No config file found; using defaults
PLAY [remote environment demo] **************************
TASK [display EXAMPLE] ***********************************
changed: [demo.example.com] => {"ansible_facts": {"discovered_interpreter_python": "/usr/libexec/platform-python"}, "changed": true, "cmd": ["echo", "$EXAMPLE"], "delta": "0:00:00.002864", "end": "2022-02-21 09:05:33.059864", "msg": "", "rc": 0, "start": "2022-02-21 09:05:33.057000", "stderr": "", "stderr_lines": [], "stdout": "test1", "stdout_lines": ["test1"]}
TASK [display EXAMPLE with different value] **************
changed: [demo.example.com] => {"changed": true, "cmd": ["echo", "$EXAMPLE"], "delta": "0:00:00.002800", "end": "2022-02-21 09:05:33.416884", "msg": "", "rc": 0, "start": "2022-02-21 09:05:33.414084", "stderr": "", "stderr_lines": [], "stdout": "test2", "stdout_lines": ["test2"]}
PLAY RECAP **********************************************
demo.example.com           : ok=2    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

解释结果

  1. Play 级别的环境变量
    • 在 Play 级别设置的 EXAMPLE 环境变量值为 test1。
    • 第一个任务 display EXAMPLE 输出了 test1。
  2. 任务级别的环境变量
    • 在任务级别覆盖了 EXAMPLE 环境变量值为 test2。
    • 第二个任务 display EXAMPLE with different value 输出了 test2。

执行前的状态

$ ssh devops@demo.example.com
Last login: Fri Feb 18 16:07:48 2022 from 192.168.0.59
[devops@demo ~]$ echo $EXAMPLE
[devops@demo ~]$
  • 在执行 Playbook 之前,远程主机上没有 EXAMPLE 环境变量。

执行后的状态

$ ssh devops@demo.example.com
Last login: Mon Feb 21 07:05:33 2022 from 192.168.251.111
[devops@demo ~]$ echo $EXAMPLE
[devops@demo ~]$
  • 在执行 Playbook 之后,远程主机上仍然没有 EXAMPLE 环境变量。这说明 environment 语句仅在 Playbook 执行期间生效,不会永久修改远程主机的环境。

总结

  • Play 级别:在 Play 级别设置的环境变量会应用于该 Play 中的所有任务。
  • 任务级别:在任务级别设置的环境变量仅对该任务生效,可以覆盖 Play 级别的设置。
  • 临时生效:environment 语句设置的环境变量仅在 Ansible Playbook 的执行期间生效,不会永久修改远程主机的环境。
  • 适用场景:非常适合在企业环境中设置代理变量(如 http_proxy、https_proxy)或其他临时环境变量。

通过这种方式,你可以灵活地在 Ansible Playbook 中管理环境变量,而不必担心对远程主机的环境造成永久性更改。