You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将文本文件数据传入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 10:21:13