如何在Ansible中遍历用户列表并在机器上创建每个用户?
我有一份用户列表,这些用户来自一个外部来源和一台远程机器。我想把这个外部来源的用户列表和我当前机器上的用户列表进行对比,然后为那些在我机器上不存在的用户创建账户。
我尝试过使用 ansible runner(下面是伪代码):
for user in users:
updateUsers(user)
这段代码会调用一个 Ansible.runner 对象,并进行如下操作:
ansible.runner.Runner(
pattern='tools',
forks=10,
module_name='user',
module_args="",
complex_args=OrderedDict(sorted(dict(name=name, group=group, state=state).items())),
sudo=True,
).run()
目前,组和状态都是全局定义的。我的问题是,在执行循环的时候,确实按照我的要求创建了用户;但主要的问题是,这些用户的主目录权限设置不对,导致他们无法访问自己的目录。比如说,如果“joeshmo”是一个用户,他就无法在自己的 ~/ 目录中写入任何东西。
我希望能得到一些指导,看看我该怎么做。有没有办法通过 playbook 动态地遍历一个文件,抓取不同的用户名,然后把它们添加为系统用户,而不会出现权限错误?有没有办法修复我当前的脚本,以避免这些错误?
谢谢
2 个回答
0
这是我会怎么做的。
首先,创建一个自定义事实脚本,这个脚本可以在收集信息时从机器上获取所有用户和组的信息。这个文件可以是任何可以执行的shell脚本,输出有效的JSON格式。
然后,把收集到的用户和组的列表与外部数据源进行比较(我不太确定你存储的格式是什么),并根据需要添加或删除用户。
我知道创建、部署和管理一个额外的自定义事实脚本会有点麻烦,但我觉得这是值得的。我尝试过仅用剧本来收集各种信息,这样会变得非常复杂,最后你可能会写出各种过滤插件,抱怨set_fact模块,最终导致剧本变成200行。
0
如果你真的需要用代码来获取用户列表,你可以在Python中自己写一个迭代器,并把它放在和你的剧本(playbook)同级的一个叫做lookup_plugins
的文件夹里。然后你就可以这样做:
# Use my custom users.py lookup plugin
- user: name={{item.name}} group={{item.group}} state=present
with_users: