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

如何用Ansible从多台Linux服务器完整获取用户信息?

问题原因

你遇到的问题根源在于lineinfile模块的默认行为:它会检查目标文件中是否已存在匹配的行,若存在则跳过写入操作。当第二台服务器的默认用户(如root、bin)已经在第一台服务器的写入过程中被添加到文件后,模块会判定这些行已存在,不会重复写入,导致这些重复用户的信息无法被记录。

解决方案

下面提供两种可行的解决方式:

方式一:为每条用户信息添加主机标识(推荐)

给每条用户记录加上服务器的主机名,确保每行内容唯一,这样lineinfile会将所有服务器的用户信息都写入文件,同时还能区分用户来自哪台服务器。修改后的任务如下:

- name: Save it in file 
  lineinfile:
    path: myfile
    line: "{{ inventory_hostname }} - {{ item.key }} {{ item.value[1] }}"
    state: present
  delegate_to: localhost
  loop: "{{ getent_passwd | dict2items }}"

方式二:使用copy模块追加内容

利用copy模块的append参数(Ansible 2.10及以上版本支持),直接将每台服务器的所有用户信息追加到文件中,不做重复检查。这种方式会一次性写入当前服务器的所有用户,效率更高:

- name: Save all users to file
  copy:
    content: |
      {% for user in getent_passwd | dict2items %}
      {{ inventory_hostname }} - {{ user.key }} {{ user.value[1] }}
      {% endfor %}
    dest: myfile
    append: yes
  delegate_to: localhost
额外说明
  • 原Playbook的lineinfile任务存在语法错误,line字段的结尾缺少闭合双引号,需要修正才能正常运行。
  • 如果不需要区分用户所属服务器,只需保留所有用户(包括重复条目),可以去掉{{ inventory_hostname }} - 部分,但这样文件中会出现重复的用户行。

内容的提问来源于stack exchange,提问作者JUNG

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 17:17:40