我是一个新的 ansible 用户,从一组 shell 脚本切换到 ansible playbook。我当前的用户管理系统仅允许将用户添加到系统,前提是该用户已被授予对该服务器类、位置和环境的访问权限(或者其中任何一个设置为通配符/任意)。
服务器类、位置和环境本地存储在客户端服务器本身上,以(仅 root 可读/可写)文件的形式存储,如下所示:
LD_CLASS="app"
LD_LOC="dfw"
LD_ENV="prod"
我找到了一些我认为与我想要的类似的例子,但我仍然不确定如何从 ansible 客户端获取变量,以及如何确保在添加用户之前满足所有 3 个类、位置和环境要求。我设想了一个这样的变量文件:
users:
-name: user1
uid: 60001
gid: 60001
class: app
location: any
env: dev
-name: user2
uid: 60002
gid: 60002
class: app
location: dfw
env: prod
根据我正在配置的 ansible 客户端收集的变量,用户模块条目看起来像这样(请注意伪代码,因为我不确定我实际上是如何实现这一点的):
- user:
name: '{{ item.name }}'
state: '{ (If $LD_LOC matches location variable, or is set to any) & ($LD_ENV matches env variable, or is set to any) & ($LD_CLASS matches class variable, or is set to any) } present{% else %}absent{% endif %}'
uid: '{{ item.uid }}'
with_items: users
我更愿意不依赖 ansible 角色,而是从 ansible 客户端本身获取类、位置和环境数据,至少部分原因是因为这是我们目前拥有的系统,它可以帮助我们轻松过渡到 ansible,同时保留一些现有和熟悉的工具。我所寻找的可能吗?
答案1
有一个功能叫做当地事实在 Ansible 中:
修改您的“属性”文件,使其如下所示,将其存储在中
/etc/ansible/facts.d/server_meta.fact
,并根据需要应用权限:[settings] ld_class=app ld_loc=dfw ld_env=prod
然后运行你的剧本并在参数中引用这些事实
state
:state: "{{ (ansible_local.server_meta.settings.ld_loc == 'dfw' and ansible_local.server_meta.settings.ld_class == 'app' and ansible_local.server_meta.settings.ld_env == 'prod' ) | ternary('present', 'absent') }}"