首页 > 解决方案 > Ansible 为所有人和组运行一个角色

问题描述

我有一个创建用户帐户的角色“totaldebug.users”。对于我的剧本,我有以下内容:

---

- name: Configure all servers.
  hosts: all
  become: true
  roles:
    - base
    - security
    - totaldebug.users

- import_playbook: tor.yml

然后在导入的剧本中我有:

---
- hosts: tor
  roles:
    - totaldebug.motd
    - totaldebug.users

然后我有以下 group_vars:

全部

users:
  - username: mainaccount
    uid: 2000
    groups: ['sudo']
    ssh-key: mypublic ssh key"

tor/vars

# Users
users:
  - username: serviceaccount
    uid: 666
    system: true

我的期望是,它首先会运行“All”组并应用用户,mainaccount然后运行 ​​tor 组并创建它,serviceaccount但它会跳过主帐户并创建服务帐户。

我这样做的原因是我想要在所有服务器上的主帐户,但是服务帐户在其他服务器上会有所不同或不需要,有没有办法实现这一点,或者我只需要在每个组 var 下添加用户并将其从全部中删除?

似乎是一个糟糕的设计,因为我不得不用任何帐户更改来更新多个文件,而不仅仅是能够在顶层全部更改它。

标签: ansible

解决方案


从广告资源 group_vars 返回的变量不取决于您定位的组,仅取决于优先规则(可以稍微调整

从上面的第一个链接中,我建议您提出建议:

就定义变量(在哪里定义某些类型的变量)达成一致的团队和项目通常会避免变量优先级问题。我们建议您在一个地方定义每个变量:找出定义变量的位置,并保持简单。例如,请参阅有关在何处设置变量的提示

这是我将如何解决您当前问题的示例。我首先要说明(只是一个例子,你可以适应):

  1. 默认用户列表在组中定义all
  2. 用户的完整列表按组计算all
  3. 其他组可以定义额外的用户列表。
  4. 一台机器只能是定义附加用户的一个组的一部分。

从那里:

  • group_vars/all.ylm
_default_users:
  - username: mainaccount
    uid: 2000
    groups: ['sudo']
    ssh-key: mypublic ssh key"

users: "{{ _default_users + (_specific_users | default([])) }}"
  • group_vars/tor.yml
_specific_users:
  - username: serviceaccount
    uid: 666
    system: true

然后,您只需要运行一次您的角色。如果您正在运行任务的特定主机存在默认用户和特定用户,它将创建它们。


推荐阅读