Ansible无法设置vars变量:任务中变量追加失效问题求助
问题原因分析
你遇到的警告[WARNING]: Ignoring invalid attribute: my_test_var,核心原因是你在shell模块的任务里直接添加了不属于该模块的参数。Ansible的每个模块(比如shell、debug)都有自己固定的参数集,shell模块只接受和命令执行相关的参数(比如cmd、chdir、register等),并不支持直接在任务里给自定义变量赋值,所以Ansible会把my_test_var当成无效属性忽略掉。
另外还有个小细节问题:out.stdout是字符串类型的结果,直接和列表my_test_var用+拼接会报错,因为字符串和列表不能直接相加,你需要把它包装成列表元素再追加。
修正后的Playbook写法
下面是正确实现需求的Playbook,我们用set_fact模块来修改自定义变量——它是Ansible中专门用于在任务执行过程中设置/更新主机变量的模块:
--- - name: Collect directory listing from all hosts hosts: all vars: my_test_var: [] tasks: - name: Get directory listing shell: ls -la register: out - name: Append output to my_test_var list set_fact: my_test_var: "{{ my_test_var + [out.stdout] }}" - name: Show collected output on each host debug: msg: "Listing of current dir: {{ my_test_var }}"
关于汇总所有主机输出的补充
如果你的最终目的是在控制节点汇总所有主机的输出,而不是每个主机单独显示自己的列表,你可以在playbook结束后,利用hostvars来收集所有主机的my_test_var数据,比如新增一个仅在控制节点执行的任务:
- name: Aggregate all hosts' output on control node debug: msg: | All hosts' directory listings: {% for host in groups['all'] %} --- {{ host }} --- {{ hostvars[host]['my_test_var'][0] }} {% endfor %} delegate_to: localhost run_once: true
这样就能在控制节点一次性看到所有主机的执行结果了。
内容的提问来源于stack exchange,提问作者may24x
相关产品推荐
相关产品推荐

