如何将文本文件数据传入Ansible Playbook?报错求助
问题
我希望有一个包含用户名和密码的文本文件,内容如下:
name: "Peter", "Joe", "Mark" password: "smith", "biden", "garyy"
我编写的Playbook如下:
--- - hosts: myhosts become: yes remote_user: root1 become_user: root vars_files: - vars.yml vars: ansible_ssh_private_key_file: "{{key}}" tasks: - name: Create users user: name="{{item.name}}" shell=/bin/bash home="/srv/{{item.name}}" groups=root generate_ssh_key=yes ssh_key_bits=2048 loop: "{{ lookup('file', 'userspasswd.txt', wantList=True)| list }}" - name: Set password to users shell: echo "{{item.name}}:{{item.password}}" | sudo chpasswd no_log: True loop: "{{ lookup('file', 'userspasswd.txt', wantList=True)| list }}"
执行时出现如下错误:
fatal: [xxx.xxx.xxx.xxx]: FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: 'ansible.utils.unsafe_proxy.AnsibleUnsafeText object' has no attribute 'name'\n\nThe error appears to be in '/home/root1/Documents/ansiblekernel/main.yml': line 12, column 5, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n - name: Create users\n ^ here\n"}
我是Ansible新手,请问有没有正确的实现方法?
正确实现方法
1. 调整用户密码文件格式
你原来的文本文件格式无法被Ansible解析为带name和password属性的字典列表,建议改成规范的YAML格式(创建userspasswd.yml文件),内容如下:
users: - name: "Peter" password: "smith" - name: "Joe" password: "biden" - name: "Mark" password: "garyy"
这种格式Ansible可以直接识别为变量,处理起来更简单可靠。
2. 修改Playbook逻辑
直接用YAML变量文件的方式实现,代码如下:
--- - hosts: myhosts become: yes remote_user: root1 become_user: root vars_files: - vars.yml - userspasswd.yml # 加载用户密码变量文件 vars: ansible_ssh_private_key_file: "{{key}}" tasks: - name: 创建用户 user: name: "{{ item.name }}" shell: /bin/bash home: "/srv/{{ item.name }}" groups: root generate_ssh_key: yes ssh_key_bits: 2048 loop: "{{ users }}" # 循环使用加载的users变量 - name: 设置用户密码 user: name: "{{ item.name }}" password: "{{ item.password | password_hash('sha512') }}" no_log: True loop: "{{ users }}"
关键说明:
- 用
user模块自带的password参数比调用shell命令更安全,且必须通过password_hash('sha512')过滤器对明文密码做哈希处理——系统存储的是哈希后的密码,直接用明文设置会失效。 - 加载YAML文件后,
users变量是现成的字典列表,循环时item.name和item.password能直接读取对应值。
错误原因
你原来的Playbook中,lookup('file', ...)读取的是纯文本内容,即便加了wantList=True,也只是把文本按行拆成字符串列表(比如name: "Peter", "Joe", "Mark"是其中一个字符串元素),不是带name属性的字典,自然会提示找不到该属性。
内容的提问来源于stack exchange,提问作者Neetesshhr
相关产品推荐
相关产品推荐

