使用Ansible精细管理系统用户

时间:2018-11-09 17:25:53

标签: ansible

我正在使用 Ansible 剧本来管理用户(摘自https://keksi.io/tutorials/2016/12/05/how-to-manage-remote-server-users-with-ansible/):

vars / users.yml 文件(用户,用户到组的分配,密码,SSH密钥):

print(something)

这是剧本:

log.pr

我可以在所有服务器上正确执行此剧本,并在其上创建和管理管理员和普通用户。

现在,我想添加一个新步骤。我有几台服务器,并不是每个用户都应该在每个服务器上都进行配置,并且某些用户应该仅在某些服务器上(例如,开发服务器上的开发人员)在另一个组中。

所以我希望为主机或主机组上的用户创建一些分配,例如:

---
users:

  - username: user1
    comment: "User 1"
    group: admin
    password: "sha password"
    keys:
      active:
        - "ssh-rsa etc"
    admin: yes

  - username: user2
    comment: "User 2"
    group: users
    groups: deployer
    keys:
      active:
        - "ssh-rsa etc"

  - username: user3
    [...]

因此,我希望能够在所有服务器上执行剧本,以使用户根据此声明创建或更新该剧本,而不必为每个主机编写剧本的副本。

我对如何实现这一目标一无所知,您能帮我吗?


编辑:我试图通过这种方式在我的users.yml变量文件中添加一个新的“主机”键:

- hosts: all
  become: true

  tasks:
    - include_vars: ../vars/users.yml

    - name: Install sudo
      apt: name=sudo state=present

    - name: Add the group admin
      group:
        name: admin
        state: present

    - name: Create users
      user:
        name: "{{ item.username }}"
        comment: "{{ item.comment | default('User {{item.username}}') }}"
        password: "{{ item.password | default('!') }}"
        state: "{{ item.state | default('present') }}"
        shell: "{{ item.shell | default('/bin/bash') }}"
        group: "{{ item.group | default('users') }}"
      when: item.username is defined
      with_items: '{{ users }}'

    - name: Setup administrator users with complete sudo access
      user: name={{ item.username }} groups=sudo append=yes
      with_items: '{{ users }}'
      when: item.admin is defined and item.admin == True

    - name: Add SSH-keys to users
      authorized_key:
        user: "{{ item.0.username }}"
        key: "{{ item.1 }}"
      with_subelements:
        - "{{ users }}"
        - keys.active
        - flags:
          skip_missing: True
      when: item.0.state is not defined or item.0.state != "absent"

    - name: Remove old SSH-keys from users
      authorized_key:
        user: "{{ item.0.username }}"
        key: "{{ item.1 }}"
        state: absent
      with_subelements:
        - "{{ users }}"
        - keys.disabled
        - flags:
          skip_missing: True
      when: item.0.state is not defined or item.0.state != "absent"

我这样修改了任务:

- host: host1
  admins:
    - user1
    - user2
  deployers:
    - user2
    - user3
  users:
    - user4
    - user5

- host: hostgroup1
  admins:
    - user2
  users:
    - user3
    - user5

我的解释:我需要创建一个用户,如果它是admin(因此必须在每台主机上创建,或者如果当前主机的ventory_hostname被列在主机子项数组之一中)(第二步,我想扩展此检查同样,如果当前主机位于item.hosts子项之一中列出的主机组中。

问题在于创建user1的方式是(因为item.admin为True),而user2不是,因为其他条件始终为False。

1 个答案:

答案 0 :(得分:0)

您可以使用host_vars或group_vars代替vars / users.yml来存储用户数据

在多台主机上运行剧本时,将从相关的group_vars或host_cars文件中读取每个主机或组成员的相应值

有关更多信息,请参见此处:https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html#splitting-out-host-and-group-specific-data