为何Ansible未赋值stdout内容,仅返回注册变量名?
Ansible注册变量未正确渲染问题排查
之前正常运行的Ansible Playbook出现异常:执行shell模块并注册变量test_value后,debug模块输出的不是变量的stdout值something,而是变量名字符串test_value。相关代码、执行结果及版本信息如下:
问题相关代码
- name: Test register ansible.builtin.shell: echo something register: test_value - name: Output test value ansible.builtin.debug: msg: "{{ test_value }}"
执行结果
TASK [foo/bar : Test register] ******************************************************************************* changed: [test_host] => {"changed": true, "cmd": "echo something", "delta": "0:00:00.002040", "end": "2023-05-24 05:49:06.107897", "msg": "", "rc": 0, "start": "2023-05-24 05:49:06.105857", "stderr": "", "stderr_lines": [], "stdout": "something", "stdout_lines": ["something"]} TASK [foo/bar : Output test value] *************************************************************************** ok: [test_host] => { "msg": "test_value" }
Ansible版本信息
ansible [core 2.13.3] config file = /etc/ansible/ansible.cfg configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules'] ansible python module location = /usr/lib/python3.9/site-packages/ansible ansible collection location = /root/.ansible/collections:/usr/share/ansible/collections executable location = /usr/bin/ansible python version = 3.9.13 (main, Nov 9 2022, 13:16:24) [GCC 8.5.0 20210514 (Red Hat 8.5.0-15)] jinja version = 3.1.2 libyaml = True
可能的问题原因及排查方向
- 外部变量覆盖注册变量:如果在inventory文件、host_vars/group_vars目录,或者通过
-e参数传入了test_value=test_value这类定义,外部变量的优先级会高于任务中注册的变量,导致debug输出预先定义的字符串值。可执行ansible test_host -m debug -a "var=test_value"在目标主机上直接查看变量值,确认是否存在外部定义。 - Jinja2模板渲染异常:
- 检查
ansible.cfg中enable_template_tasks是否被设为False,该配置会直接影响Playbook的模板渲染能力; - 排查Playbook文件是否存在编码问题(如不可见字符、全角符号),导致变量名无法被Jinja正确识别;
- 确认
jinja2_native配置无异常,虽然2.13.3版本兼容Jinja2 3.x,但错误设置可能引发渲染失败。
- 检查
- 变量注册逻辑被干扰:
- 检查两个任务之间是否存在被忽略的其他任务,意外修改或覆盖了
test_value变量; - 可新增debug任务输出
{{ test_value.stdout }},测试是否能正确获取子字段,以此判断变量是否被正确注册为字典类型。
- 检查两个任务之间是否存在被忽略的其他任务,意外修改或覆盖了
- 环境或配置变更:近期若修改过
ansible.cfg、Python环境或Ansible依赖包,可能导致渲染逻辑异常。可尝试在干净环境中测试该Playbook,对比结果定位问题。
内容的提问来源于stack exchange,提问作者notsodev
相关产品推荐
相关产品推荐

