如何用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
相关产品推荐
相关产品推荐

