Ansible subelements循环处理用户密钥报错,求解决方案
Ansible subelements过滤器循环报错解决
问题场景
尝试运行以下测试代码,使用Ansible的subelements过滤器循环处理users变量中的用户名称、授权密钥文件及对应密钥:
- hosts: localhost gather_facts: no vars: users: - name: user1 authorized_keys_file: authorized_keys_file_1.log authorized_keys: - key1 - key2 - name: user2 authorized_keys_file: authorized_keys_file_2.log authorized_keys: - key1 tasks: - name: List keys to add to authorized_key_file debug: msg: "User={{ item.0.name }} File={{ item.0.authorized_keys_file }} key={{ item.1 }}" loop: - "{{ users | subelements('authorized_keys') }}"
报错信息
The task includes an option with an undefined variable. The error was: 'list object' has no attribute 'name'
期望输出
User=user1 File=authorized_keys_file_1 key=key1 User=user1 File=authorized_keys_file_1 key=key2 User=user2 File=authorized_keys_file_2 key=key1
解决方案
错误原因是loop参数里多套了一层列表(- "{{ users | subelements('authorized_keys') }}"),导致item变成了整个subelements返回的列表,而非预期的元组。
修正后的代码只需去掉loop下的列表符号,直接使用subelements的结果:
- hosts: localhost gather_facts: no vars: users: - name: user1 authorized_keys_file: authorized_keys_file_1.log authorized_keys: - key1 - key2 - name: user2 authorized_keys_file: authorized_keys_file_2.log authorized_keys: - key1 tasks: - name: List keys to add to authorized_key_file debug: msg: "User={{ item.0.name }} File={{ item.0.authorized_keys_file }} key={{ item.1 }}" loop: "{{ users | subelements('authorized_keys') }}"
运行修正后的代码,就能得到预期的循环输出,后续也可以直接把这个逻辑迁移到ansible.posix.authorized_key模块中使用。
内容的提问来源于stack exchange,提问作者Gryphus71
相关产品推荐
相关产品推荐

