Ansible执行命令时PYTHONPATH被误判为文件/目录,如何正确设置环境变量?
问题描述
我编写了如下Ansible Playbook片段:
- name: 迁移Graphite配置 command: argv: - PYTHONPATH=/opt/graphite/webapp/ - django-admin - migrate - --settings=graphite.settings ignore_errors: yes
执行后出现错误:
fatal: [localhost]: FAILED! => {"changed": false, "cmd": "PYTHONPATH=/opt/graphite/webapp/ django-admin migrate --settings=graphite.settings", "msg": "[Errno 2] No such file or directory: b'PYTHONPATH=/opt/graphite/webapp/'", "rc": 2}
问题在于Ansible错误地将PYTHONPATH=/opt/graphite/webapp/当作了可执行文件/目录,而它实际是要设置的环境变量。请问该如何让命令正确识别这是环境变量而非文件/目录?
解决方法
Ansible的command模块中,argv列表内的每一项都会被当作命令或命令参数,无法直接在这里写环境变量赋值语句。正确做法是使用Ansible专属的environment参数单独设置环境变量:
修正后的Playbook:
- name: 迁移Graphite配置 command: argv: - django-admin - migrate - --settings=graphite.settings environment: PYTHONPATH: "/opt/graphite/webapp/" ignore_errors: yes
说明
environment是Ansible专为任务设置环境变量设计的字段,它会在执行目标命令前先导出指定的环境变量,再运行命令。- 将环境变量从
argv中移除,只保留真正的命令和参数,就能避免Ansible把环境变量误判为可执行文件的问题。
内容的提问来源于stack exchange,提问作者itinneed2022_1
相关产品推荐
相关产品推荐

