如何在Ansible中为各服务器分配指定用户并执行授权任务?
问题解答
(1) 在Inventory中指定服务器对应用户的方法
你可以通过在Inventory中给主机或组定义assigned_users变量来实现,只需要列出该主机/组需要关联的用户名,不用重复用户的完整信息(比如SSH密钥),既灵活又避免冗余。
修改后的Inventory示例(主机级定义)
[dbs] server1.intranet assigned_users=["user1"] [webservices] server2.intranet assigned_users=["user1", "user2"] [apps] server3.intranet assigned_users=["user2"]
组级定义(适合多台主机共享相同用户配置)
[dbs] server1.intranet [webservices] server2.intranet [apps] server3.intranet [dbs:vars] assigned_users=["user1"] [webservices:vars] assigned_users=["user1", "user2"] [apps:vars] assigned_users=["user2"]
这种方式下,用户核心信息统一放在变量文件中,需要变更用户时,只需修改Inventory里的assigned_users列表,或调整变量文件的用户详情即可,用户也可以被分配到多台服务器。
(2) 执行任务时仅处理当前主机的用户
在任务中使用Ansible的selectattr过滤器,从全局users变量里筛选出当前主机assigned_users列表对应的用户,修正后的任务代码如下:
- name: 为指定用户添加SSH密钥 ansible.posix.authorized_key: user: "{{ item.name }}" state: present key: "{{ item.ssh_key }}" loop: "{{ users | selectattr('name', 'in', assigned_users) | list }}"
关键说明:
selectattr('name', 'in', assigned_users):遍历全局users变量,筛选出name字段存在于当前主机assigned_users列表中的用户对象| list:将过滤器返回的迭代器转为列表,供loop循环调用- 推荐使用
loop替代旧语法with_items,两者功能一致但loop是Ansible当前标准写法
执行任务时,每台主机只会处理自身assigned_users列表对应的用户,不会涉及无关用户。
内容的提问来源于stack exchange,提问作者user1156544
相关产品推荐
相关产品推荐

