如何在Ansible shell模块的creates参数中使用环境变量?
Ansible Shell模块creates参数使用环境变量的问题
问题描述
我正在使用Ansible内置的shell模块,希望在creates参数中使用环境变量,示例代码如下:
- name: Run pyenv install of Python 3.10.7 shell: cmd: | exec $SHELL pyenv install 3.10.7 # Is something like this possible? creates: $PYENV_ROOT/versions/3.10.7我的问题是:
- 上述用法是否可行?
- 环境变量会从Ansible控制节点还是目标节点展开?
解答
1. 用法是否可行?
直接在creates参数中写$PYENV_ROOT不可行。因为Ansible的creates参数由控制节点的Python进程处理,不会通过目标节点的shell解析环境变量,$PYENV_ROOT会被当作普通字符串,无法正确展开。
要实现需求,有两种可行方案:
- 方案一:获取目标节点的PYENV_ROOT值
先通过shell命令获取目标节点的PYENV_ROOT,再赋值给变量使用:- name: Get PYENV_ROOT from target node shell: echo $PYENV_ROOT register: pyenv_root_output - name: Run pyenv install of Python 3.10.7 shell: cmd: | exec $SHELL pyenv install 3.10.7 creates: "{{ pyenv_root_output.stdout }}/versions/3.10.7" - 方案二:使用已收集的ansible_env变量
如果之前执行过setup模块,目标节点的环境变量会被存在ansible_env中,可直接引用:- name: Run pyenv install of Python 3.10.7 shell: cmd: | exec $SHELL pyenv install 3.10.7 creates: "{{ ansible_env.PYENV_ROOT }}/versions/3.10.7"
2. 环境变量的展开节点
直接写$PYENV_ROOT的话,不会在目标节点展开——它会被控制节点的Python进程处理,但Python不会解析shell环境变量,所以会原样保留字符串。只有通过上述方案,让变量在目标节点执行命令获取值,才能得到目标节点的PYENV_ROOT。
内容的提问来源于stack exchange,提问作者Intrastellar Explorer
相关产品推荐
相关产品推荐

