如何在 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
解释结果
- Play 级别的环境变量
- 在 Play 级别设置的
EXAMPLE环境变量值为test1。 - 第一个任务
display EXAMPLE输出了test1。
- 在 Play 级别设置的
- 任务级别的环境变量
- 在任务级别覆盖了
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 中管理环境变量,而不必担心对远程主机的环境造成永久性更改。